Maven: 子模块中激活配置文件的属性

7
我们有一个多模块的Maven项目,需要在不同平台上运行,例如JBoss 4和JBoss 7。我们通过指定platform属性,并将其用作构件分类器以及子模块中特定于平台的配置文件的激活来实现。例如:
<activation>
    <property>
        <name>platform</name>
        <value>jboss71x</value>
    </property>
</activation>

在这些配置文件中,我们会指定所提供依赖的版本。例如,我们会导入jboss父级pom:
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.as</groupId>
            <artifactId>jboss-as-parent</artifactId>
            <version>${dependencies.jbossas7.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

当我们将属性作为命令行参数指定(-Dplatform=jboss71x),它可以正常工作。

但是当属性在根pom.xml的<properties>部分中设置时(我还尝试在父pom中设置它),似乎来自父pom的版本被遗漏了:

[ERROR]     'dependencies.dependency.version' for commons-lang:commons-lang:jar is missing. @ line 46, column 21
[ERROR]     'dependencies.dependency.version' for commons-beanutils:commons-beanutils:jar is missing. @ line 56, column 21
[ERROR]     'dependencies.dependency.version' for commons-collections:commons-collections:jar is missing. @ line 61, column 21

最新的Maven版本是3.2.1。

为什么会出现这种情况,我们如何在pom.xml中指定此属性值,而不是在命令行中指定?

1个回答

17
很遗憾,你想做的事情是不可能的。在找到Codehaus网站上这个说明之前,我花了数小时尝试同样的事情:

请注意,只有在Maven命令行上设置的属性才能激活配置文件。在POM、父POM或其他配置文件中设置的属性无效。

基本上,配置文件激活发生在POM处理的非常早期,在所有属性被插值之前。实质上,这意味着激活配置文件的属性必须在构建的最开始就有一个定义好的值——作为系统属性,因此在命令行上——因为配置文件激活发生在Maven处理任何<properties>元素之前。在一个相似的StackOverflow问题的答案中提供了更多详细和背景文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接