在集成 Maven、Tycho 和 Eclipse 时处理非 OSGi 依赖项
Posted
技术标签:
【中文标题】在集成 Maven、Tycho 和 Eclipse 时处理非 OSGi 依赖项【英文标题】:Handling non-OSGi dependencies when integrating Maven, Tycho and Eclipse 【发布时间】:2014-04-14 04:55:49 【问题描述】:我有一堆基于 Eclipse 的插件,我一直在迁移到 Maven/Tycho。这些插件中的大多数都依赖于我现在通过 Maven 管理的独立库,而不是与.jar
文件混在一起。
我当前设置中最繁琐的部分是由于 Tycho 明显无法处理仅 Maven(即非 OSGi)工件。我目前的设置是这样的:
在每个 Eclipse 插件的pom.xml
中,我在initialize
阶段向maven-dependency-plugin
发出unpack
目标。这会将我指定的工件解压缩到单独的 target/dependencies
目录中。
target/dependencies
目录作为输出目录添加到build.properties
中,以便Tycho在编译时可以将其添加到classpath中:
source.. = src/main/java/
output.. = target/classes/
output.. = target/dependencies/
target/dependencies
目录被添加到META-INF/MANIFEST.MF
中的Bundle-ClassPath
库中。
这些设置允许compile
Maven 指令编译插件。从 VCS 导入项目并手动将 target/dependencies
目录指定为 Eclipse 中的类文件夹允许所述 IDE 也编译插件。
不幸的是,这是一个相当麻烦的解决方案,原因如下:
配置maven-dependency-plugin
需要列出所有应解压的工件。一个可以使用unpack-dependencies
而不是unpack
,但这也会解压所有OSGi依赖项——在每个项目目录中解压一半的Eclipse并不是我的乐趣......
在 Eclipse 中添加 class 文件夹需要运行一次 Maven initialize
,以便创建 target/dependencies
目录。
纯 Maven 项目与其在 Eclipse 中依赖的 Tycho 项目之间没有源代码连接。对于从 Maven 项目传播到 Tycho 项目的更改,例如Eclipse 可能会显示一个潜在的编译问题,必须先 mvn install
Maven 项目,然后在 Tycho 项目中运行 mvn clean initialize
以删除先前解压缩的依赖项并拉入当前集合。然后你必须刷新 Eclipse 项目并希望 Eclipse 做正确的事情。
同样,从 Tycho 项目中查看依赖项的源代码不会显示主要源文件,而是显示 target/dependencies
中可用的任何内容 - 很可能只是 .class
文件。
我认为必须有一个更合理的方法来解决这个问题 - 可以让 Eclipse 和 Maven 项目更紧密地集成。
那么,我错过了什么?此用例的推荐设置是什么?有更好的选择吗?最好是不需要设置一堆 Nexus 和/或 p2 存储库的东西?
【问题讨论】:
【参考方案1】:您可以尝试带有 Embed-Dependency 的 maven-bundle-plugin。
见http://wiki.eclipse.org/Tycho/How_Tos/Dependency_on_pom-first_artifacts
官方演示效果很好。但是,我仍然无法以这种方式使用我的 jar 文件。
【讨论】:
这是否让 Eclipse 将仅 Maven 依赖项的源代码与其在 Eclipse/Tycho 插件中的消费者代码“连接”起来?因为 that 是我设置中最烦人的部分;如果我破坏了一个界面,直到我mvn clean initialize
所有相关的第谷项目时我才会注意到...
@thkala 如果可行,我认为答案是肯定的。由于eclipse默认会首先在workspace中解析maven依赖。但是,目前我的 Eclipse 不能停止说“生命周期映射“org.sonatype.tycho.m2e.wrapperBundle”不可用。”在这个方法中。【参考方案2】:
似乎我们采用了类似的策略。但是,我使用的是 nexus 混合存储库(同时具有 maven 和 p2)。
-
对于解包依赖项,我使用 maven-dependency-plugin 将它们放置在目标/依赖项中(见下文)。
1.1。复制依赖项无需解包即可完成所需的工作。
您的来源和输出与我的大致相同。
2.1。是的,mvn 必须初始化目标/依赖项
我只在 MANIFEST 中包含所需的 jar,因为 1 会检索到许多不必要的 jar。
3.1。我手动选择相关的罐子。
3.2。是的,如果非 Eclipse 管理(maven)项目发生变化(在您的工作区之外),那么您必须运行 mvn build 来更新它们。
3.3。完成这项工作的关键是:
3.3.1 将您的 maven 和 Eclipse 项目部署到(快照)存储库。我使用 http://www.sonatype.org/nexus/ 。因此,当您运行 maven 时,它会查看 nexus 存储库以获取 maven 和 Eclipse 项目的更新。
其他一些可能已经很明显的注释:
4.1。 pom.xml 文件应仅包含非 Eclipse jar 作为依赖项。 (tycho 插件处理所有 Eclipse 依赖项,这些依赖项应该可以在您的(nexus)存储库中找到。)
4.2。将依赖的 jars 添加到 Eclipse 中的运行时(通过编辑 plugin.xml 运行时)
Maven 插件:
<plugin>
<!-- Copy non-Ecipse plugins to target/dependency so that may be referenced
for runtime use. -->
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<excludeGroupIds>org.XXX</excludeGroupIds>
</configuration>
</execution>
<execution>
<id>classpath</id>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<fileSeparator>/</fileSeparator>
<prefix>target/dependency</prefix>
<outputFile>$project.build.directory/classPath.txt
</outputFile>
</configuration>
</execution>
</executions>
</plugin>
示例 build.properties
bin.includes = META-INF/,
target/classes/,
plugin.xml,
target/dependency/mongo-java-driver-2.11.3.jar
示例清单(仅 jar 的一个子集):
Bundle-ClassPath: .,
target/classes/,
target/dependency/mongo-java-driver-2.11.3.jar
【讨论】:
【参考方案3】:官方演示确实运行良好,并展示了嵌入非 OSGI 依赖项的方法,或者换句话说,为其他依赖项创建 OSGI 外观。
方法确实是手动复制依赖项,使它们成为 OSGI 清单的一部分并导出感兴趣的包。
然而,真正的问题是在 Eclipse 中执行依赖插件。
即使使用相应的 M2E 连接器也无法运行,因此会阻止发现和 PDE 类路径解析。
【讨论】:
以上是关于在集成 Maven、Tycho 和 Eclipse 时处理非 OSGi 依赖项的主要内容,如果未能解决你的问题,请参考以下文章
如何用maven tycho构建自己的Eclipse RCP应用
Jacoco和Tycho surefire的Eclipse RCP插件代码介绍
Tycho 的 Maven 多模块中的自定义 pom.xml 文件名