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

标签 maven eclipse-plugin tycho

我正在尝试从部署在远程 Maven 存储库中的第谷功能 Artifact 构建 p2 存储库,而不必先将 Artifact 安装到本地 Maven 存储库中(如 Tycho fails to resolve reference from product to eclipse-feature from a different reactor build 中),也无需构建所有功能和在单个 react 堆构建中一起存储存储库。

背景

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

这样我就可以单独构建每个模块 - 并且我可以在我们的 Nexus Maven 存储库中引用 OSGI Artifact - 我启用了 <pomDependencies>consider</pomDependencies>在我的目标平台中,并像往常一样使用 <dependency/> 在模块之间添加 Maven 依赖项或添加到存储库 Artifact 中元素。

这很有效 - 我可以构建功能或运行插件测试,而它们的依赖插件不在我的本地 Maven 存储库中或在同一个 react 器构建中。例如,当我运行 mvn test在插件测试项目中,将从 Nexus 下载相关依赖项,Tycho 会很乐意解决 Import-Package s 在我的 list 中针对这些,构建所有内容并运行测试。到现在为止还挺好。

我想从这些特性中生成一个 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 存储库:
  • 作为同一 react 堆构建的一部分 .如果我制作 eclipse-repository Tycho 多模块项目中的一个模块,并立即构建整个项目,例如mvn verify ,功能解决得很好。但我不想这样做。我更喜欢单独构建模块。这意味着我们的 CI 可以为每个模块提供一个指标,我们可以立即看到哪些模块测试失败了;它为我们提供了并行构建的机会;并且我们避免了必须在未更改的模块上不断运行构建。不得不使用单体 Maven 构建将是一种耻辱。
  • 如果我将 Tycho 项目安装到我本地的 Maven 存储库中 ,通过运行 mvn install在依赖上。但我也不想这样做,因为这意味着构建本质上是不可复制的,因为它对本地存储库的状态很敏感。我们的 CI 目前设置为为每个作业维护一个 Maven 存储库,并在执行开始时完全删除它,以保护我们免受这种潜在的困惑。

  • 所以我的问题是:有第三种方式吗?有什么办法可以让 Tycho 插件负责构建 eclipse-repository从远程 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 项目,它只包含存储库和功能。
    feature-project
     |- feature1    (eclipse-feature)
     |- feature2    (eclipse-feature)
     |- repository  (eclipse-repository)
    

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

    然而,这远非理想,因为我不能再将我的功能逻辑地存储在我的插件旁边;它们需要位于不同的项目层次结构中。尝试分别构建功能和存储库,例如 mvn clean verify -pl :feature1,feature2,repository , 失败可能是由于 Bug 380152 .

    有更好的方法吗?任何帮助将不胜感激。

    非常感谢

    (顺便说一句:如果功能存在于本地 Maven 存储库中,则使用 mvn clean verify -Dtycho.localArtifacts=ignore 构建存储库将 成功 ,并且不会向您显示正在从本地存储库解析 Artifact 的警告。 . 这是一个错误吗?)

    最佳答案

    你的透彻分析给我留下了深刻的印象。您几乎已经涵盖了当前 Tycho 版本 (0.22.0) 可以实现的所有内容 - 除了非常不直观的解决方案,我不希望任何人能够猜到它(见下文)。但是请注意,还需要进行一个小修复才能使解决方案适用于 SNAPSHOT Artifact 。

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

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

    但是第谷 build 的项目呢?这些可以部署到 Maven 存储库中!是的,这是真的,这就是为什么我试图扩展 pomDependencies 概念以允许您尝试执行的操作。这个想法是,每次 Tycho 考虑目标平台的 POM 依赖项时,它还会检查 p2 索引文件 ...-p2metadata.xml 是否存在。和 ...-p2artifacts.xml存在。然而,结果证明这是一个巨大的性能损失,因为 Maven 存储库服务器通常需要很长时间才能确定 Artifact 不存在。因此远程下载被禁用,并替换为在本地 Maven 存储库中查找。这样,两个第谷构建可以设置 -Dtycho.localArtifacts=ignore并且仍然能够通过本地 Maven 存储库交换 POM 中指定的 Artifact 。

    了解这些实现细节后,我们得到了以下解决方案:您不仅需要从存储库向功能 Artifact 添加 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 索引文件,因此第谷将主 Artifact 识别为第谷 Artifact 。通过这种方式,您还可以通过 POM 依赖项将 eclipse-feature 引入目标平台 - 至少几乎是这样:使用 0.22.0,存储库构建通过,但缺少 feature.jar Artifact 。这个问题我已经调试过了,是easy to fix .

    显然是三个 <dependency> 的语法每个实际依赖项的元素都不好。应该可以将其归结为单个 p2artifacts元素 - 但这是更多的工作。如果您对此功能感兴趣,可以 open an enhancement request in Tycho's issue tracker .

    关于maven - 通过解析 Maven 存储库中的 Tycho 特性来构建 p2 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27046544/

    相关文章:

    ruby-on-rails - 在 Aptana Studio 3 中找不到 RadRails View

    java - AtomicReference<T> 的阻塞版本 - 等待 Eclipse 启动终止

    maven - 第谷:通过多模块父级构建时出现 'Unable to satisfy dependency ...'

    java - maven重新打包模块解决依赖冲突

    java - 如何在大型 SVN/Maven 项目中使用 Project Lombok

    java - 使用maven将第三方代码添加到具有依赖项的eclipse项目中?

    eclipse-plugin - Jetty 9 WTP 插件

    eclipse - Tycho 功能/插件构建包含特定于平台的片段插件

    maven - 第谷 - 导入包上的 "Unsatisfied constraint"

    安卓 : Best way to add library dependency to Android Library