考虑以下场景:我的应用程序对我自己的POM第一个工件(使用纯Maven构建)有一些依赖关系,并且依赖于我自己的清单第一个工件(使用Tycho构建)。对于POM第一个工件,Tycho解析了我在POM中指定的版本。对于清单优先工件,Tycho解析了可能具有更高版本的本地构建的单元。
在我的具体情况中,我在pom.xml中为版本1.2.0中的清单优先工件指定了一个依赖项,但我收到警告“以下本地构建的单元已用于解决项目依赖关系”,版本1.3 .0.2012xxx。
我已经发现了以下错误和讨论,但我不明白为什么Tycho解决POM优先和清单优先依赖性存在差异。
答案 0 :(得分:8)
在Tycho中,依赖性解决是一个两步的过程:
首先,Tycho计算所谓的target platform,即
考虑依赖性解析的工件集。
在这一步中,Tycho根据的评估POM依赖关系
Maven规则并将结果添加到目标平台。还有,全部
添加了mvn install
本地构建的Tycho工件
到目标平台。
然后,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工件。但是,由于您还使用mvn install
在本地构建了一个较新版本的Tycho工件,因此这些工具也将位于目标平台中。因此,依赖关系解析(步骤2)可以选择两个版本,通常会选择更高版本。
要防止将本地构建的工件添加到目标平台,可以删除文件~/.m2/repository/.meta/p2-local-metadata.properties
。 (我假设你已经知道这一点,但为了确定。Bug 355367还将在0.16.0中带来另一个更方便的选项。)
现在我终于明白了为什么与Tycho工件相比,POM第一个工件的行为有所不同:
假设多个Tycho工件在同一个反应堆中一起构建。然后,每个工件可以使用其他工件作为依赖性而无需任何特定的目标平台配置,例如,您不需要POM依赖于同一反应堆中的工件。 (或者换句话说:来自同一反应堆的上游工件自动成为模块目标平台的一部分。)因此,为了支持Tycho反应堆部分的重建(在整个反应堆的mvn install
之后),需要在每个模块的目标平台上添加本地安装的Tycho工件。 Tycho不知道他们原来是否属于同一个反应堆,所以它只是将它们全部加起来。
对于POM优先工件,即使只构建了一个Tycho反应器的一部分,也始终存在对工件的引用(通过Maven配置继承)。因此,不需要任何机制来获取本地构建的POM第一个工件的任何版本,但Tycho可以将精确指定的版本添加到目标平台。
答案 1 :(得分:1)
对于有兴趣在解析目标平台时强制tycho忽略本地工件的人,请添加CLI tycho.localArtifacts = ignore,例如:
mvn clean install -Dtycho.localArtifacts=ignore
上找到