通过解析Maven存储库中的Tycho功能构建p2存储库

我试图从部署在远程Maven存储库中的Tycho功能构件构建一个p2存储库,而不必将构件首先安装到本地Maven存储库中(如在Tycho未能将产品的参考从一个产品解析为eclipse-feature不同的反应堆构建),而无需在单个反应堆构建中将所有功能部件和存储库一起构建。

背景

我有一个多模块的Tycho项目,可以构建多个Eclipse插件和功能。

所以我可以分别构建每个模块 - 以便我可以在我们的Nexus Maven存储库中引用OSGI构件 - 我在我的目标平台中启用了<pomDependencies>consider</pomDependencies> ,并在模块之间或存储库中添加了Maven依赖关系像通常一样使用<dependency/>元素创建工件。

这很好 - 我可以构建这些功能或运行插件测试,而不需要依赖它们的插件在我的本地Maven仓库或相同的反应堆版本中。 例如,当我在插件测试项目上运行mvn test时,将从Nexus下载相关依赖项,并且Tycho将愉快地解决我的清单中的Import-Package与这些问题相关的问题,构建一切并运行测试。 到现在为止还挺好。

我想从这些功能中生成一个p2存储库,以便我可以从更新站点将它们安装到Eclipse中,并且广告方式是使用eclipse-repository打包类型。 但是这里的计划下降了 - 当构建存储库时,Tycho似乎无法解决功能依赖关系,因为它可以在构建功能时解决插件依赖关系。 所有的尝试产生:

[ERROR] Cannot resolve project dependencies:
[ERROR]   Software being installed: my.eclipse.repository raw:0.0.1.'SNAPSHOT'/format(n[.n=0;[.n=0;[-S]]]):0.0.1-SNAPSHOT
[ERROR]   Missing requirement: my.eclipse.repository raw:0.0.1.'SNAPSHOT'/format(n[.n=0;[.n=0;[-S]]]):0.0.1-SNAPSHOT requires 'my.prj.eclipse.project.feature.feature.group 0.0.0' but it could not be found

有两种方法成功构建了p2存储库:

  • 作为同一反应堆的一部分 。 如果我使用eclipse-repository作为Tycho多模块项目中的一个模块,并且使用例如mvn verify一次构建整个项目,那么功能解决得很好。 但我不想这样做。 我宁愿单独构建模块。 这意味着我们的CI可以为每个模块指示一个指示器,我们可以立即看到哪些模块测试失败了; 它为我们提供了平行构建的机会; 并且我们避免了必须不断地运行基于未改变的模块的构建。 不得不使用单体Maven构建是一件令人遗憾的事情。
  • 如果我将Tycho项目安装到本地Maven存储库中mvn install在依赖项上运行mvn install 。 但是我也不想这样做,因为这意味着构建本质上是无法再生产的,因为它对本地资源库的状态很敏感。 我们的CI目前被设置为每个作业都维护一个Maven仓库,并在执行开始时彻底清除它,以防我们摆脱这种潜在的混乱。
  • 所以我的问题是:有第三种方法吗? 有没有什么办法让我可以让Tycho插件负责构建eclipse-repository包装类型以从远程Maven存储库下载功能? 或者,我可以使用已经单独构建并部署到Maven存储库的插件来构建p2存储库吗?

    我尝试过的东西包括:

  • jareclipse-feature两种方式指定Maven特性的依赖性
  • 明确地将这些功能添加到目标平台上

    ... <artifactId>target-platform-configuration</artifactId> <version>${tycho.version}</version> <configuration> <dependency-resolution> <extraRequirements> <requirement> <type>eclipse-feature</type> <id>my.prj.eclipse.project.feature</id> <versionRange>0.0.0</versionRange> </requirement> ...


  • 我发现一个体面的解决方案最接近的是一个多模块的Tycho项目,它只包含存储库和功能。

    feature-project
     |- feature1    (eclipse-feature)
     |- feature2    (eclipse-feature)
     |- repository  (eclipse-repository)
    

    构建这个工作 - 所有添加到顶级POM的插件都是从Nexus下载的,可以包含在每个功能中并包含在生成的存储库中。

    然而,这远非理想,因为我无法再将我的功能与我的插件逻辑地保存在一起; 他们需要在单独的项目层次结构中。 尝试单独构建功能和存储库,例如使用mvn clean verify -pl :feature1,feature2,repository ,可能由于错误380152而失败。

    有没有更好的办法? 任何帮助将受到感谢。

    非常感谢


    mvn clean verify -Dtycho.localArtifacts=ignore一下:用mvn clean verify -Dtycho.localArtifacts=ignore构建存储库mvn clean verify -Dtycho.localArtifacts=ignore成功,如果这些功能存在于本地Maven存储库中,并且不会向您显示工件正在从本地repo解析的警告。这是一个错误?)


    你的深入分析给我留下了深刻的印象。 几乎所有的东西都可以用当前的Tycho版本(0.22.0)进行覆盖 - 除了那些非常不直观的解决方案,我不希望任何人能够猜到它(见下文)。 但请注意,还需要一个小的修复程序,以使解决方案适用于SNAPSHOT工件。

    但首先,我想为您观察的内容提供一些技术(和历史)背景:

    pomDependencies =仅考虑插件的作用:此功能的用例是允许从Maven存储库中引用插件(或更确切地说是OSGi包)。 因此,当标志被设置并且项目对JAR具有依赖性时,Tycho将检查它们是否是OSGi捆绑包,为它们即时生成p2元数据,并将它们添加到目标平台。 功能JAR没有类似的支持,因为它们通常在Maven存储库中不存在。

    但是Tycho建造的项目呢? 这些可能会部署到Maven仓库! 是的,这是真的,这就是为什么我试图扩展pomDependencies概念以允许你尝试做什么。 这个想法是,每次Tycho考虑目标平台的POM依赖性时,它也检查是否存在p2索引文件...-p2metadata.xml...-p2artifacts.xml 。 然而,事实证明,这导致了巨大的性能损失,因为Maven仓库服务器通常需要很长时间才能发现一个工件不存在。 因此,远程下载被禁用,并用本地Maven仓库中的查找替换。 通过这种方式,两个Tycho构建可以设置-Dtycho.localArtifacts=ignore ,并且仍然能够通过本地Maven存储库交换在POM中指定的工件。

    了解这些实现细节后,我们得到以下解决方案:除了仅将POM依赖项从存储库添加到功能工件,您还需要将依赖关系添加到p2metadata和p2artifacts文件。 例:

    <dependencies>
        <dependency>
            <groupId>myproject</groupId>
            <artifactId>myproject.feature</artifactId>
            <version>0.1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>myproject</groupId>
            <artifactId>myproject.feature</artifactId>
            <version>0.1.0-SNAPSHOT</version>
            <classifier>p2metadata</classifier>
            <type>xml</type>
        </dependency>
        <dependency>
            <groupId>myproject</groupId>
            <artifactId>myproject.feature</artifactId>
            <version>0.1.0-SNAPSHOT</version>
            <classifier>p2artifacts</classifier>
            <type>xml</type>
        </dependency>
    </dependencies>
    

    这使得Maven也可以下载这些p2索引文件,所以Tycho认识到主要的神器是Tycho神器。 通过这种方式,您还可以通过POM依赖项将eclipse功能导入目标平台 - 至少差不多:通过0.22.0,存储库构建可以通过,但缺少feature.jar工件。 我已经调试过这个问题,而且很容易修复。

    显然,每个实际依赖关系的三个<dependency>元素的语法并不好。 应该可以将它归结为单个p2artifacts元素 - 但这是更多的工作。 如果您对此功能感兴趣,可以在Tycho的问题跟踪器中打开增强请求。

    链接地址: http://www.djcxy.com/p/52315.html

    上一篇: Building a p2 repository by resolving Tycho features from a Maven repository

    下一篇: Dependencies from pom.xml not considered by Eclipse in Tycho Project