首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过解析Maven存储库中的Tycho特性来构建p2存储库

通过解析Maven存储库中的Tycho特性来构建p2存储库
EN

Stack Overflow用户
提问于 2014-11-20 18:08:23
回答 1查看 3.8K关注 0票数 13

我试图从部署在远程Maven存储库中的Tycho特性构件构建一个p2存储库,而不必首先将工件安装到本地Maven存储库中(如Tycho无法解析从产品到eclipse的引用--来自不同反应堆构建的特性),并且不必在单个反应堆构建中一起构建所有特性和存储库。

背景

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

因此,我可以分别构建每个模块--并在我们的Nexus存储库中引用OSGI构件--我已经在我的目标平台中启用了<pomDependencies>consider</pomDependencies>,并将<dependency/>元素添加到模块之间或存储库构件之间的Maven依赖项中。

这很好--我可以构建这些特性或者运行插件测试,而不需要它们依赖的插件在我的本地Maven存储库中或者在相同的反应堆构建中。例如,当我在插件测试项目上运行mvn test时,相关的依赖项将从Nexus下载,Tycho将很高兴地根据这些特性解析清单中的Import-Package,构建所有内容并运行测试。到目前一切尚好。

我想从这些特性生成一个p2存储库,这样我就可以从一个更新站点在Eclipse中安装它们,而所宣传的方法是使用eclipse-repository打包类型。但是在这里,计划失败了-- Tycho在构建存储库时似乎无法解决特性依赖,就像它在构建特性时能够解决插件依赖一样。所有尝试都会产生以下结果:

代码语言:javascript
复制
[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。但我也不想这样做,因为这意味着构建本身是不可再生的,因为它对本地存储库的状态很敏感。我们的CI目前设置为维护每个作业的Maven存储库,并在执行开始时彻底清除它,以保护我们免受这种潜在的混乱。

所以我的问题是:还有第三条路吗?有没有办法让负责构建eclipse-repository打包类型的Tycho插件从远程Maven存储库下载特性?或者任何其他方法,我都可以通过单独构建并部署到Maven存储库的插件构建p2存储库。

我尝试过的事情包括:

  • 将Maven特性指定为jareclipse-feature
  • 显式地向目标平台添加功能,如 ... <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项目,它只包含存储库和特性。

代码语言:javascript
复制
feature-project
 |- feature1    (eclipse-feature)
 |- feature2    (eclipse-feature)
 |- repository  (eclipse-repository)

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

然而,这远非理想,因为我不再能够在逻辑上将我的特性与插件一起存储;它们需要处于单独的项目层次结构中。试图单独构建特性和存储库,比如使用mvn clean verify -pl :feature1,feature2,repository,可能由于Bug 380152而失败。

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

非常感谢

(顺便提一下:如果本地Maven存储库中存在特性,使用mvn clean verify -Dtycho.localArtifacts=ignore构建存储库将继承,并且不会向您显示工件正在从本地回购中解析的警告.这是窃听器吗?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-27 14:34:21

你的透彻分析给我留下了深刻的印象。现在的Tycho版本(0.22.0)几乎涵盖了所有的内容--除了解决方案之外,这个解决方案太不直观了,我不希望任何人能猜到它(见下文)。但是,请注意,还需要一个小的修复来使解决方案适用于快照工件。

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

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

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

了解了这些实现细节之后,我们得到了以下解决方案:与其将POM依赖项从存储库添加到特性工件,还需要将依赖项添加到p2metadata和p2artifacts文件中。示例:

代码语言:javascript
复制
<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的问题跟踪器中打开一个增强请求

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27046544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档