当集成Maven、Tycho和Eclipse时处理非OSGi依赖

14

我有一堆基于Eclipse的插件,正在将它们迁移到Maven/Tycho。这些插件中的大部分依赖于单独的库,我现在通过Maven管理它们,而不是使用 .jar文件。

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

  1. 在每个Eclipse插件的pom.xml中,在initialize阶段发出对maven-dependency-pluginunpack目标命令,解压我指定的构件到单独的target/dependencies目录。

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

    source.. = src/main/java/
    output.. = target/classes/
    output.. = target/dependencies/
    
  3. target/dependencies目录添加到META-INF/MANIFEST.MF中的Bundle-ClassPath库中。

这些设置允许compile Maven指令编译插件。从版本控制系统导入项目并在Eclipse中手动指定target/dependencies目录作为类文件夹,也允许该IDE编译插件。

不幸的是,这是一个相当繁琐的解决方案,原因如下:

  • 配置maven-dependency-plugin需要列出应解压缩的所有工件。人们可以使用unpack-dependencies而不是unpack,但这也会解压缩所有OSGi依赖项-让每个项目目录中都有Eclipse的一半是不好玩的...

  • 在Eclipse中添加类文件夹需要运行Maven initialize一次,以创建target/dependencies目录。

  • 纯Maven项目与其相关的Tycho项目之间没有源连接。要使更改从Maven项目传播到Tycho项目,以便例如Eclipse显示潜在的编译问题,必须在Tycho项目中运行mvn clean initialize去除以前解压缩的依赖项并拉入当前设置, 然后您必须刷新Eclipse项目并希望Eclipse做正确的事情。

    同样,从Tycho项目查看依赖项的源不会显示主要源文件,而是显示target/dependencies中可用的任何内容-很可能只是一个.class文件。

我认为一定有一个更合理的方法来处理这个问题-一些允许Eclipse和Maven项目更紧密集成的方法。

那么,我缺少什么?对于这种用例,推荐的设置是什么?是否有更好的替代方法?最好不需要设置一堆Nexus和/或p2存储库吗?

3个回答

3

看起来我们采用了类似的策略。不过,我使用了一个混合仓库(同时包含Maven和P2)。

  1. 我使用maven-dependency-plugin来解压依赖项并将它们放置在target/dependency目录下(见下文)。
    • 1.1. copy-dependencies可以在不解压的情况下完成所需操作。
  2. 您的源代码和输出结果与我的大致相同。
    • 2.1. 是的,mvn必须初始化target/dependencies目录。
  3. 我只在MANIFEST中包含所需的jars文件,因为1会检索许多不必要的jars。
    • 3.1. 我手动选择相关的jars文件。
    • 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 jars作为依赖项。(tycho插件处理所有Eclipse依赖项,应在您的(nexus)存储库中找到。)
    • 4.2. 在Eclipse中添加依赖jars文件的运行时(通过编辑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

0

这能让Eclipse将仅在Maven中的依赖项的源代码与Eclipse/Tycho插件中的使用者代码“连接”吗?因为是我设置中最烦人的部分;如果我打破了接口,直到我“mvn clean initialize”所有相关的Tycho项目,我才会注意到它... - thkala
如果它能工作,我认为答案是肯定的。因为Eclipse默认会先在工作区中解决Maven依赖关系。然而,目前我的Eclipse在这个方法中一直说“生命周期映射“org.sonatype.tycho.m2e.wrapperBundle”不可用”。 - xi.lin

0
官方演示确实很好,展示了嵌入非OSGI依赖项的方法,或者换句话说,为其他依赖项创建OSGI外观。
方法确实是手动复制依赖项,使它们成为OSGI清单的一部分,并导出感兴趣的包。
然而,真正的问题是在Eclipse内执行依赖插件。
即使使用相应的M2E连接器,它也无法运行,从而阻止了发现和PDE类路径解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接