Maven 2 Maven:在依赖项分类器中使用继承属性会导致生成失败

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://

给定三个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有帮助。现在,只要存储库只包含B的jar文件,C就会构建。如果我将B的POM文件与存储库中的JAR一起上载,C将失败,出现上述错误(
${swt.classifier
}未定义)。有什么想法吗

我知道这个问题与有关,但我不确定如何解决它

我不确定是否有与此问题相关的链接,我在上面显示的pom.xml中没有看到任何与概要文件激活相关的内容

事实上,我甚至不确定是否理解预期结果。分类器应该从哪里来?也许我遗漏了一些部分,但我认为您应该安装/部署一个合格的B版本(具有完全解析的POM),并让C依赖于这个合格的版本


我需要如何修改B的POM以部署合格的版本?我希望SWT的分类器在B的构建时得到解决,而不是C的构建时

是的,但在C的构建时,C需要BB的依赖项,因此必须完全解决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
就这么简单(而且令人费解)

如果您希望该属性能够以某种方式得到完全的“解析”,并且在构建C时已经得到了很好的定义,那么您就不理解Maven是如何处理这些属性的。这让他们感到孤独。有人试图在Maven 2.1中做一些不同的事情(当您安装A时,分类器属性表达式将转换为它的值),但没有成功,导致了许多令人惊讶的行为,它被还原为2.2,事实上导致2.1很快被弃用。有关更多详细信息,以及有关问题到底有多复杂的提示,请参阅下面的链接

在Maven开发人员做出相反决定之前,我认为我们将继续保持自2.0以来一直存在的行为:“忽略工件坐标中的表达式。用户有足够的绳子来吊死自己”


不过,一旦你习惯了,它就不再令人困惑了。只有当你试图猜测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