Maven 2 Maven:在依赖项分类器中使用继承属性会导致生成失败
给定三个POM文件:Maven 2 Maven:在依赖项分类器中使用继承属性会导致生成失败,maven-2,inheritance,profiles,Maven 2,Inheritance,Profiles,给定三个POM文件: C取决于B B继承自A 我可以建造A和B C无法生成,因为它依赖于B 完整的源代码和构建输出包含在下面供您审阅 以下是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://
- C取决于B
- B继承自A
- 我可以建造A和B
- C无法生成,因为它依赖于B
<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有帮助。现在,只要存储库只包含B的jar文件,C就会构建。如果我将B的POM文件与存储库中的JAR一起上载,C将失败,出现上述错误(${swt.classifier
}未定义)。有什么想法吗
我知道这个问题与有关,但我不确定如何解决它
我不确定是否有与此问题相关的链接,我在上面显示的pom.xml中没有看到任何与概要文件激活相关的内容
事实上,我甚至不确定是否理解预期结果。分类器应该从哪里来?也许我遗漏了一些部分,但我认为您应该安装/部署一个合格的B版本(具有完全解析的POM),并让C依赖于这个合格的版本
我需要如何修改B的POM以部署合格的版本?我希望SWT的分类器在B的构建时得到解决,而不是C的构建时 是的,但在C的构建时,C需要B和B的依赖项,因此必须完全解决B的已安装/部署
.pom
。至少,我认为事情可以这样做
但我必须承认,我不知道如何准确地处理这个案件,在阅读了诸如或页面之类的问题后,我完全困惑了
我建议以正确的方式将其发布在maven用户列表上(我将密切关注该线程,因为我认为我现在需要修复一些使用概要文件、属性和依赖项的损坏POM,谢谢:)maven正在尝试查找工件org.eclipse.swt:swt:3.6.1,但坐标没有正确解析。错误是没有从POM.xml中的
块中识别${swt.classifier}。由于该值显示在
块中,您能否验证正在运行的Maven命令
尝试以下操作:mvn依赖项:解析-p windows-x86
此外,请验证SWT版本和分类器是否确实正确。我在Maven Central上看到的最新版本不是3.6.0,而是您在评论中写道的“我希望SWT的分类器在B的构建时得到解决,而不是在C的构建时”,但这是错误的-您需要在C的构建时使用分类器,因为C依赖于SWT(通过a传递)。这种依赖关系只完全由属性决定,因此您必须有一种在C的pom中计算属性的方法
- A依赖于swt-${classifier}
- C取决于A
- 因此C依赖于swt-${classifier}
- 因此C的pom必须定义属性。它可以由概要文件(如a中)定义,也可以在运行时手动定义(不利于再现性),但没有它,您无法构建C
不过,一旦你习惯了,它就不再令人困惑了。只有当你试图猜测Maven时,你才会感到惊讶。从Maven 3.1.0开始,这是不可能的。以下是相关的功能请求:我需要如何修改B的POM以部署合格的版本?我希望SWT的分类器在B的构建时得到解决,而不是在C的构建时。我已经在B中添加了一个分类器。如果存储库只包含B的jar文件,那么C将构建。如果存储库还包含B的POM文件,C的构建将失败,并且${swt.classifier}未定义。有什么想法吗?@Gili:
如果存储库只包含B的jar文件,那么C将构建
是的,但它不会获得可传递的依赖项。不太好<代码>如果存储库还包含B的POM文件,C的构建将失败,并且${swt.classifier}未定义,这是问题的核心<代码>有什么想法吗?没有,对不起,这就是我建议发布到maven用户列表的原因。发布:Pascal是对的。C没有个人资料。关于SWT,有问题的工件存在于我的私有存储库中,因此这不是问题所在(否则B不会正确构建)。我理解覆盖依赖项版本/分类器的需要,但删除默认值/父值会使子POM更难维护,并导致重复。我尝试定义${swt.classifier}在C语言中,Maven仍然抱怨它无法解析属性。有什么想法吗?我不明白,如果你定义了属性,Maven为什么无法解析属性。你会得到同样的错误?你确定你已经定义了它吗?有什么帮助:有效的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>
<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>
------------------------------------------------------------------------
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