在集成 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 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Tycho build 1: 构建插件

如何用maven tycho构建自己的Eclipse RCP应用

Jacoco和Tycho surefire的Eclipse RCP插件代码介绍

Tycho 的 Maven 多模块中的自定义 pom.xml 文件名

如何在非 Tycho 项目中使用 pomless tycho 工件

Maven构建时出现访问限制错误