5

考虑以下场景:我的应用程序有一些依赖于我自己的 POM 优先工件(使用纯 Maven 构建)和一些依赖于我自己的清单优先工件(使用 Tycho 构建)。对于 POM-first 工件,Tycho 准确解析了我在 POM 中指定的版本。对于 manifest-first 工件,Tycho 解析可能具有更高版本的本地构建单元。

在我的具体情况下,我在 pom.xml 中指定了对版本 1.2.0 中清单优先工件的依赖关系,但我收到警告“以下本地构建的单元已用于解决项目依赖关系”版本为 1.3.0.2012xxx .

我已经发现了以下错误和讨论,但我不明白为什么 Tycho 在解决 POM-first 和 manifest-first 依赖项方面存在差异。

4

2 回答 2

8

在 Tycho 中,依赖解析是一个两步过程:

  • 首先,Tycho 计算所谓的目标平台,它是被考虑用于依赖解析的工件集。在这一步中,Tycho 根据 Maven 规则评估 POM 依赖关系并将结果添加到目标平台。此外,您在本地构建的所有 Tycho 工件mvn install都将添加到目标平台。

  • 然后,Tycho 根据 OSGi 规则解析您项目的依赖项(来自 MANIFEST.MF、feature.xml 等)。与 Maven 依赖项不同,OSGi 依赖项通常指定为版本范围。所以如果你写

    Require-Bundle: my.bundle;bundle-version="1.2.0"  
    

    你是说你想要 1.2.0 或更高版本。您通常不想在此处指定确切的版本,因为这会对运行时产生影响。但是您确实想控制构建时发生的事情,这就是为什么有多种方法可以控制目标平台的内容。

在您的特定情况下,您在 POM 中指定的版本的目标平台中拥有 POM 优先工件。然后,您似乎还为您的 Tycho 工件指定了 POM 依赖项(这并不常见,但没关系),因此您将在目标平台的指定版本中拥有 Tycho 工件。但是由于您还使用 本地构建了较新版本的 Tycho 工件mvn install,因此这些也将在目标平台中。因此,依赖关系解析(第 2 步)可以在两个版本之间进行选择,通常会选择较新的版本。

为了防止本地构建的工件被添加到目标平台,您可以删除文件~/.m2/repository/.meta/p2-local-metadata.properties. (我假设您已经知道这一点,但只是为了确定。Bug 355367还将在 0.16.0 中带来一个替代的、更方便的选项。)

现在我终于回答了你的问题,为什么 POM 优先工件的行为与 Tycho 工件的行为不同:

  • 假设多个第谷工件在同一个反应器中一起构建。然后每个工件可以使用其他工件作为依赖项,而不需要任何特定的目标平台配置,例如,您不需要 POM 依赖于同一反应器中的工件。(或者换句话说:来自同一反应器的上游工件自动成为模块目标平台的一部分。)因此,为了支持第谷反应器部分的重新构建(在mvn install整个反应器之后),本地安装的第谷工件需要被添加到每个模块的目标平台。第谷不知道它们最初是否属于同一个反应堆,所以它只是将它们全部添加。

  • 对于 POM 优先的工件,对工件的引用始终存在(通过 Maven 配置继承),即使只构建了 Tycho 反应器的一部分。因此,不需要任何机制来获取本地构建的 POM 优先工件的任何版本,但 Tycho 可以将精确指定的版本添加到目标平台。

于 2012-09-10T12:05:56.867 回答
3

对于那些有兴趣在解析目标平台时强制 tycho 忽略本地工件的人,请添加 CLI tycho.localArtifacts=ignore,例如

mvn clean install -Dtycho.localArtifacts=ignore

更多细节可以在Tycho-Target Eclipse Wiki上找到

于 2016-07-19T07:42:46.253 回答