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

2022-09-04 04:45:34

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

我当前设置中最繁琐的部分是由于第谷显然无法处理仅限Maven(即非OSGi)的工件。我当前的设置是这样的:

  1. 在每个 Eclipse 插件中,我都会在阶段中发布一个目标。这会将我指定的工件解压缩到单独的目录中。pom.xmlunpackmaven-dependency-plugininitializetarget/dependencies

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

    source.. = src/main/java/
    output.. = target/classes/
    output.. = target/dependencies/
    
  3. 该目录将添加到 的库中。target/dependenciesBundle-ClassPathMETA-INF/MANIFEST.MF

这些设置允许 Maven 指令编译插件。从VCS导入项目并在Eclipse中手动将目录指定为类文件夹允许所述IDE编译插件。compiletarget/dependencies

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

  • 配置 需要列出应解压缩的所有项目。可以使用 代替 ,但这也将解压缩所有 OSGi 依赖项 - 在每个项目目录中解压缩一半的 Eclipse 并不是我的乐趣所在......maven-dependency-pluginunpack-dependenciesunpack

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

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

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

我认为必须有一种更合理的方法来解决这个问题 - 这将使Eclipse和Maven项目能够更紧密地集成。

那么,我错过了什么呢?此用例的建议设置是什么?有没有更好的选择?最好是不需要设置一堆Nexus和/或p2存储库的东西?


答案 1

似乎我们应用了类似的策略。但是,我使用nexus混合存储库(同时具有maven和p2)。

  1. 为了解压缩依赖关系,我使用maven-dependency-plugin将它们放在target/dependency中(见下文)。
    • 1.1. 复制依赖关系无需解包即可完成所需的操作。
  2. 您的源和输出与我的大致相同。
    • 2.1. 是的,mvn 必须初始化目标/依赖项
  3. 我只在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. 其他一些注意事项,可能已经很明显了:
    • 4.1. pom.xml文件应该只包含非 Eclipse jar 作为依赖项。(tycho 插件处理所有 Eclipse 依赖项,这些依赖项应该在您的(nexus)存储库中找到。
    • 4.2. 将依赖 jar 添加到 Eclipse 中的运行时(通过编辑插件.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>

示例生成属性

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

答案 2

您可以尝试使用嵌入依赖项的 maven-bundle-plugin。

查看 http://wiki.eclipse.org/Tycho/How_Tos/Dependency_on_pom-first_artifacts

官方演示效果很好。但是,我仍然无法以这种方式成功使用我的jar文件。


推荐