情景:
<activation><property><name>foo</name></property><activation>
foo
属性 - 该配置文件处于非活动状态且不会为父版本执行<properties><foo>true</foo></properties>
,希望在执行子构建时激活属性并激活配置文件。没有这样的运气。配置文件永远不会被激活,这告诉我永远不会设置属性。mvn package -Dfoo=true
会激活父母和子女的个人资料我是在尝试做不可能的事情还是只是做错了?
P.S。嗯 - 即使我在父级中定义属性,也不会触发配置文件。是什么给了什么?
答案 0 :(得分:8)
为了扩展@ rich-seller的答案,以及@Bostone的自我回答,似乎不可能有一个设置,其中父POM定义了一些配置文件作为替代,并且子POM默认选择其中一个配置文件,同时允许您暂时覆盖孩子的选择(即在CLI上)。考虑使用一些框架和相关插件的项目的父POM,我们可以假设它们的版本都由属性定义:
<profiles>
<profile>
<id>newest</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<framework.version>2.0</framework.version>
<plugin.version>2.0</plugin.version>
</properties>
</profile>
<profile>
<id>older</id>
<activation>
<property>
<name>older.framework</name>
<value>true</value>
</property>
</activation>
<properties>
<framework.version>1.1</framework.version>
<plugin.version>1.1</plugin.version>
</properties>
</profile>
</profiles>
现在,默认情况下继承自此父POM的子项将使用2.0,正如您所期望的那样,-Polder
或-Dolder.framework=true
将尝试使用旧框架构建它(例如,测试兼容性)。但是你不能写在孩子POM中
<properties>
<older.framework>true</older.framework>
</properties>
并自动激活older
个人资料。如果默认情况下newest
未处于活动状态,您可以使用基于文件的激活来使该模块针对1.1进行构建,但是对于2.0而言暂时运行它并不容易:据我所知older
如果您通过newest
,则-Pnewest
个人资料会处于有效状态,因此您需要明确禁用其他配置文件,如果您有十几个配置文件,这些配置文件是不合理的。因此,除了将配置文件信息复制到子POM之外,没有其他解决方案:
<properties>
<framework.version>1.1</framework.version>
<plugin.version>1.1</plugin.version>
</properties>
此时-Pnewest
将 无法覆盖这些属性,因此您需要使用-Dframework.version=2.0 -Dplugin.version=2.0
。
换句话说,只有在默认情况下所有子模块都可以使用相同的配置文件(此处为newest
)时,配置文件才有用。如果其中一些通常用1.1构建,一些用2.0构建,那么这些配置文件是无用的。
似乎这是Maven核心增强的一个用例,或者可能是Maven 3构建扩展。想到http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activators和https://github.com/maoo/maven-tiles。
答案 1 :(得分:5)
只能通过命令行传递的属性激活配置文件。这是因为POM中的属性只能在解析POM后处理,此时解析配置文件激活为时已晚。
除非您能够从命令行传递属性,在settings.xml中指定配置文件激活(通常不是一个好主意),或者使用变通方法,否则使用此方法会有点困难22。在我的previous answer中使用标记文件的存在。
如果您使用Maven 2.1.0+,最后一个选择是仅通过父POM的命令行停用配置文件,这显然仍不理想。
您可以使用字符'!'停用个人资料或' - '像这样:
mvn install -P !profile-1,!profile-2
答案 2 :(得分:5)
直接回答我自己的问题:在多模块构建中,所有属性都是在构建运行之前设置的,因此不可能在模块中激活/停用其中一个模块 em>基于在子POM中设置propety的构建。但是,如果您正在寻找通过其他方式进行此操作的方法,请read this comment