在集成Maven,Tycho和Eclipse时处理非OSGi依赖项
我有一堆基于Eclipse的插件,我一直在迁移到Maven / Tycho。 大多数这些插件依赖于我现在通过Maven管理的单独库,而不是混淆.jar
文件。
我当前设置中最麻烦的部分是由于Tycho显然无法处理仅Maven(即非OSGi)工件。 我目前的设置如下:
-
在每个Eclipse插件的
pom.xml
,我在initialize
阶段向maven-dependency-plugin
发出unpack
目标。 这会将我指定的工件解包到一个单独的target/dependencies
录中。 -
target/dependencies
目录被添加为build.properties
的输出目录,以便Tycho可以在编译时将其添加到类路径中:source.. = src/main/java/ output.. = target/classes/ output.. = target/dependencies/
-
target/dependencies
目录被添加到META-INF/MANIFEST.MF
的Bundle-ClassPath
库中。
这些设置允许compile
Maven指令来编译插件。 从VCS导入项目并在Eclipse中手动指定target/dependencies
项目录作为类文件夹允许所述IDE也编译插件。
不幸的是,由于以下几个原因,这是一个相当麻烦的解决方案:
-
配置
maven-dependency-plugin
需要列出应该解压缩的所有工件。 可以使用unpack-dependencies
而不是unpack
,但这也会解压所有OSGi依赖项 – 在每个项目目录中解压缩一半的Eclipse并不是我的乐趣…… -
在Eclipse中添加类文件夹需要将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存储库的东西?
我们似乎采用了类似的策略。 但是,我使用nexus混合存储库(同时具有maven和p2)。
- 对于解包依赖项,我使用maven-dependency-plugin将它们放在目标/依赖项中(见下文)。
- 1.1。 copy-dependencies在没有解包的情况下完成所需的操作。
- 您的来源和输出与我的大致相同。
- 2.1。 是的,mvn必须初始化目标/依赖项
- 我只在MANIFEST中包含所需的jar子,因为1会检索许多不必要的jar子。
- 3.1。 我手动选择相关的jar子。
- 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。 将依赖jar添加到Eclipse中的运行时(通过编辑plugin.xml运行时)
Maven插件:
maven-dependency-plugin 2.1 copy-dependencies copy-dependencies org.XXX classpath build-classpath / target/dependency ${project.build.directory}/classPath.txt
示例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
您可以使用Embed-Dependency尝试maven-bundle-plugin。
见http://wiki.eclipse.org/Tycho/How_Tos/Dependency_on_pom-first_artifacts
官方演示效果很好。 但是,我仍然没有成功地以这种方式使用我的jar文件。
官方演示确实运行良好,并显示嵌入非OSGI依赖项的方式,或者换句话说,为其他依赖项创建OSGI外观。
方法确实是手动复制依赖项,使它们成为OSGI清单的一部分并导出感兴趣的包。
然而,真正的问题是从Eclipse中执行依赖插件。
即使使用相应的M2E连接器也无法运行,因此阻止了发现和PDE类路径分辨率。