在集成Maven,Tycho和Eclipse时处理非OSGi依赖项

我有一堆基于Eclipse的插件,我一直在迁移到Maven / Tycho。 大多数这些插件依赖于我现在通过Maven管理的单独库,而不是混淆.jar文件。

我当前设置中最麻烦的部分是由于Tycho显然无法处理仅Maven(即非OSGi)工件。 我目前的设置如下:

  1. 在每个Eclipse插件的pom.xml ,我在initialize阶段向maven-dependency-plugin发出unpack目标。 这会将我指定的工件解包到一个单独的target/dependencies录中。

  2. target/dependencies目录被添加为build.properties的输出目录,以便Tycho可以在编译时将其添加到类路径中:

     source.. = src/main/java/ output.. = target/classes/ output.. = target/dependencies/ 
  3. target/dependencies目录被添加到META-INF/MANIFEST.MFBundle-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)。

  1. 对于解包依赖项,我使用maven-dependency-plugin将它们放在目标/依赖项中(见下文)。
    • 1.1。 copy-dependencies在没有解包的情况下完成所需的操作。
  2. 您的来源和输出与我的大致相同。
    • 2.1。 是的,mvn必须初始化目标/依赖项
  3. 我只在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. 其他一些注释,可能已经很明显了:
    • 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类路径分辨率。