Maven:在依赖性分类器中使用继承属性会导致构建失败

时间:2010-11-13 06:03:58

标签: 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://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}未定义)而失败。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

在你写的评论中,“我希望SWT的分类器在B的构建时间得到解决,而不是C的构建时间”,但这是错误的 - 你需要C语言构建时的分类器,因为C依赖于swt(通过A传递)。这种依赖性只能由一个属性完全决定,所以你必须有一种方法来评估C的pom中的属性。

  • A取决于swt - $ {classifier}
  • C取决于A
  • 因此C取决于swt - $ {classifier}
  • 因此C的pom必须定义属性。它可以由配置文件定义(如在A中),也可以在运行时手动定义(对于可重复性不好),但如果没有它,则无法构建C.

这很简单(也很令人费解)。

如果您希望该属性在某种程度上得到完全“解决”,并且在构建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-4140Artifact-Coordinate Expression Transformation页面等问题后,我完全感到困惑。

我建议在maven用户列表中以正确的方式发布此内容(我将密切关注该主题,因为我认为我有一些破坏的POM使用配置文件,属性和依赖项来立即修复,谢谢:))