繁体   English   中英

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

[英]Handling non-OSGi dependencies when integrating Maven, Tycho and Eclipse

我有一堆基于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中包含所需的罐子,因为1会检索许多不必要的罐子。
    • 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中的运行时(通过编辑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

您可以使用Embed-Dependency尝试maven-bundle-plugin。

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

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

官方演示确实运行良好,并显示嵌入非OSGI依赖项的方式,或者换句话说,为其他依赖项创建OSGI外观。

方法确实是手动复制依赖项,使它们成为OSGI清单的一部分并导出感兴趣的包。

然而,真正的问题是从Eclipse中执行依赖插件。

即使使用相应的M2E连接器也无法运行,从而阻止了发现和PDE类路径分辨率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM