给出三个POM文件:
完整的源代码和构建输出包含在下面供您查看。
这是A的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>A</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>A</name>
<repositories>
<repository>
<id>foo releases</id>
<name>libs-releases-local</name>
<layout>default</layout>
<url>http://foo.net/artifactory/libs-releases-local</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>swt</artifactId>
<classifier>${swt.classifier}</classifier>
<version>3.6.1</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>windows-x86</id>
<properties>
<swt.classifier>win32-x86</swt.classifier>
</properties>
</profile>
</profiles>
</project>
这是B的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.foo</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../A</relativePath>
</parent>
<artifactId>B</artifactId>
<packaging>jar</packaging>
<name>B</name>
<profiles>
<profile>
<id>windows-x86</id>
<properties>
<swt.classifier>win32-x86</swt.classifier>
</properties>
</profile>
</profiles>
</project>
这是C的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>C</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>C</name>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>B</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
以下是C:
的构建输出------------------------------------------------------------------------
Building C
task-segment: [install]
------------------------------------------------------------------------
[compiler:compile]
Nothing to compile - all classes are up to date
Downloading: http://foo.net/artifactory/libs-releases-local/org/eclipse/swt/swt/3.6.1/swt-3.6.1-${swt.classifier}.jar
[WARNING] Unable to get resource 'org.eclipse.swt:swt:jar:${swt.classifier}:3.6.1' from repository foo releases (http://foo.net/artifactory/libs-releases-local): Error transferring file: foo.net
Downloading: http://repo1.maven.org/maven2/org/eclipse/swt/swt/3.6.1/swt-3.6.1-${swt.classifier}.jar
Unable to find resource 'org.eclipse.swt:swt:jar:${swt.classifier}:3.6.1' in repository central (http://repo1.maven.org/maven2)
------------------------------------------------------------------------
[ERROR]BUILD ERROR
------------------------------------------------------------------------
Failed to resolve artifact.
Missing:
----------
1) org.eclipse.swt:swt:jar:${swt.classifier}:3.6.1
我知道这个问题与https://issues.apache.org/jira/browse/MNG-3228有关,但我不确定如何修复它。请帮忙!
更新:
为B添加分类器有帮助。现在只要存储库只包含B的jar文件,就构建C语言。如果我将B的POM文件与存储库中的JAR一起上传,则C会因上述错误(${swt.classifier
}未定义)而失败。有什么想法吗?
答案 0 :(得分:2)
在你写的评论中,“我希望SWT的分类器在B的构建时间得到解决,而不是C的构建时间”,但这是错误的 - 你需要C语言构建时的分类器,因为C依赖于swt(通过A传递)。这种依赖性只能由一个属性完全决定,所以你必须有一种方法来评估C的pom中的属性。
这很简单(也很令人费解)。
如果您希望该属性在某种程度上得到完全“解决”,并且在构建C时已经很好地定义了,那么您就不会理解Maven如何处理这些属性。它让他们独自一人。试图在Maven 2.1中做一些不同的东西(当你安装A时,分类器属性表达式将被转换为它的值),但是它没有成功,导致许多令人惊讶的行为,它被恢复为2.2,并且实际上导致了2.1要快速弃用。有关详细信息以及有关问题实际复杂程度的一些提示,请参阅下面的链接。
https://cwiki.apache.org/confluence/display/MAVENOLD/Artifact-Coordinate+Expression+Transformation
在Maven开发人员另有决定之前,我认为我们将继续拥有自2.0以来的行为:“人工坐标中的表达式被忽略。用户有足够的绳索可以自行挂起”
但是,一旦你习惯它,它就不再混淆了。只有当你试图猜测Maven时才会感到惊讶。
答案 1 :(得分:1)
Maven正试图找到工件org.eclipse.swt:swt:3.6.1但是坐标没有被正确解析。该错误表示无法从POM.xml中的<properties/>
块识别 $ {swt.classifier} 。由于该值显示在<profile/>
块中,您可以验证正在运行的Maven命令吗?
试试这个:mvn dependency:resolve -P windows-x86
此外,验证SWT版本和分类器实际上是否正确。我在Maven Central上看到的最新版本不是3.6.0,而是3.3.0-v3346
答案 2 :(得分:1)
从Maven 3.1.0开始,这是不可能的。以下是相关功能请求:https://issues.apache.org/jira/browse/MNG-1388
答案 3 :(得分:0)
我知道这个问题与https://issues.apache.org/jira/browse/MNG-3228有关,但我不确定如何修复它。
我不确定是否存在此问题的链接,我在上面显示的pom.xml中没有看到与配置文件激活相关的任何内容。
实际上,我甚至不确定理解预期的结果。分类器应该从哪里来?也许我错过了一些部分,但我认为你应该安装/部署一个合格的B版本(带有完全解析的POM)并让C依赖于这个合格的版本。
我如何修改B的POM以部署合格版本?我期待SWT的分类器在B的构建时间得到解决,而不是C的构建时间。
是的但是在C的构建时,C需要B 和 B的依赖关系,因此必须完全解析B的安装/部署.pom
。至少,这就是我认为事情可以发挥作用的方式。
但我必须承认,我不确定如何准确处理此案例,在阅读MNG-4140或Artifact-Coordinate Expression Transformation页面等问题后,我完全感到困惑。
我建议在maven用户列表中以正确的方式发布此内容(我将密切关注该主题,因为我认为我有一些破坏的POM使用配置文件,属性和依赖项来立即修复,谢谢:))