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

通过从Maven存储库解析Tycho功能构建p2存储库,maven,eclipse-plugin,tycho,Maven,Eclipse Plugin,Tycho,我正试图从部署在远程Maven存储库中的Tycho功能构件构建p2存储库,而不必首先将构件安装到本地Maven存储库中(如中所示),也不必在单个反应堆构建中一起构建所有功能和存储库 背景 我有一个多模块的Tycho项目,它构建了几个Eclipse插件和特性 feature-project |- feature1 (eclipse-feature) |- feature2 (eclipse-feature) |- repository (eclipse-repository)

我正试图从部署在远程Maven存储库中的Tycho功能构件构建p2存储库,而不必首先将构件安装到本地Maven存储库中(如中所示),也不必在单个反应堆构建中一起构建所有功能和存储库

背景

我有一个多模块的Tycho项目,它构建了几个Eclipse插件和特性

feature-project
 |- feature1    (eclipse-feature)
 |- feature2    (eclipse-feature)
 |- repository  (eclipse-repository)
因此,我可以单独构建每个模块,并且可以引用我们的Nexus Maven存储库中的OSGI工件。我在目标平台中启用了
consive
,并像往常一样使用
元素在模块之间或存储库工件中添加了Maven依赖项

这工作得很好-我可以构建特性或运行插件测试,而不需要依赖它们的插件在本地Maven存储库中或在同一个反应堆构建中。例如,当我在一个插件测试项目上运行
mvn测试时,相关的依赖项将从Nexus下载,Tycho将很高兴地解决清单中的
导入包
s,构建所有内容并运行测试。到目前为止还不错

我想从这些特性生成一个p2存储库,这样我就可以从一个更新站点在Eclipse中安装它们,而宣传的方法是使用
Eclipse存储库
打包类型。但是这个计划失败了——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存储库
    作为Tycho多模块项目中的一个模块,并使用例如
    mvn verify
    一次构建整个项目,那么这些特性将得到很好的解决。但我不想这么做。我更喜欢单独构建模块。这意味着我们的CI可以为每个模块设置一个指示器,我们可以立即看到哪些模块测试失败;它为我们提供了并行构建的机会;我们还避免了在未更改的模块上不断运行构建。如果不得不使用单片Maven构建,那将是一种耻辱
  • 如果我通过在依赖项上运行
    mvn install
    将Tycho项目安装到本地Maven存储库中。但我也不想这样做,因为这意味着构建本身是不可恢复的,因为它对本地存储库的状态很敏感。我们的CI当前的设置是为每个作业维护一个Maven存储库,并在执行开始时完全删除它,以保护我们免受这种潜在的混乱
所以我的问题是:还有第三条路吗?有没有办法让负责构建
eclipse存储库的Tycho插件从远程Maven存储库下载功能?或者我可以用任何其他方法从单独构建并部署到Maven存储库的插件构建p2存储库

我尝试过的事情包括:

  • 将Maven特性的依赖性指定为
    jar
    eclipse特性
  • 明确地向目标平台添加特性,如

    。。。
    

    有更好的办法吗?任何帮助都将受到感激

    非常感谢



    (顺便提一下:如果本地Maven存储库中存在这些功能,那么使用
    mvn clean verify-Dtycho.localArtifacts=ignore
    构建存储库将成功,并且不会向您显示正在从本地repo解析工件的警告……这是一个错误吗?)你的透彻分析给我留下了深刻的印象。您几乎已经涵盖了当前Tycho版本(0.22.0)可能涵盖的所有内容-除了解决方案,该解决方案非常不直观,我不希望任何人能够猜到(见下文)。但是请注意,还需要一个小的修复程序才能使解决方案对快照工件起作用

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

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

    但是第谷建造的项目呢?这些可以部署到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>
    
    
    我的项目