Maven - 根据属性激活子配置文件
Posted
技术标签:
【中文标题】Maven - 根据属性激活子配置文件【英文标题】:Maven - activate child profile based on property 【发布时间】:2010-12-03 01:19:03 【问题描述】:场景:
-
鉴于
-
定义配置文件和子项(作为模块)的父 POM
将通过引用父 POM 来使用配置文件的子项目。
<activation><property><name>foo</name></property><activation>
由于父级未定义 foo
属性 - 配置文件处于非活动状态,不会为父级构建执行
现在,我在子级中定义<properties><foo>true</foo></properties>
,希望在执行子级构建并激活配置文件时获取该属性。没有这样的运气。配置文件从未激活,这告诉我该属性从未设置。
请注意:mvn package -Dfoo=true
激活父母和孩子的个人资料
我是在尝试做不可能的事情还是只是做错了?
附:嗯 - 即使我在父级中定义属性,配置文件也不会被触发。什么给了?
【问题讨论】:
【参考方案1】:为了扩展@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 浮现在脑海中。
【讨论】:
是的。我接受这个,因为它建立在我的答案之上,我通常不喜欢接受我自己的 非常有用的信息。感谢您提供有关基于文件的激活的提示;这非常干净地解决了我的问题。【参考方案2】:直接回答我自己的问题:在多模块构建中,所有属性都是在构建运行之前设置的,因此不可能在其中一个模块中激活/停用配置文件在 em> 基于在子 POM 中设置属性的构建。但是,如果您正在寻找使用其他方式的方法,请read this comment
【讨论】:
【参考方案3】:只能通过从命令行传递的属性激活配置文件。这是因为 POM 中的属性只有在 POM 被解析后才能被处理,此时解决配置文件激活为时已晚。
除非您能够从命令行传递属性,在 settings.xml 中指定配置文件激活(通常不是一个好主意),或者使用解决方法在我的previous answer 中使用标记文件的存在。
如果您使用的是 Maven 2.1.0+,最后一种选择是仅通过命令行为父 POM停用配置文件,这显然仍然不理想。
您可以使用字符“!”停用个人资料或像这样的“-”:
mvn install -P !profile-1,!profile-2
【讨论】:
我很害怕。实际上,配置文件的执行似乎已设置,并且在构建开始后无法更改(即使使用标记文件)。停用这些 -1 和 -2 指的是什么?如果我有父母和孩子以及个人资料“构建”,以下是否会假设取消父母的个人资料? (在我的测试中不是)mvn install -P !buiild-1
我不太明白。为什么<missing>
或<exists>
配置文件触发器对您不起作用?
示例是停用两个名为profile-1
和profile-2
的配置文件,-1
或-2
没有特殊意义。在你的情况下,它只是mvn install -P !build
但这会停用整个配置文件,并且不会在父级或子级上执行?还是我错过了什么?
您只会将参数传递给父项目的构建,因此在安装/部署父项目时配置文件不会处于活动状态。然而,配置文件将在已安装的 pom 中,因此当构建一个孩子时,配置文件将被继承并处于活动状态(假设您没有使用参数显式停用它)以上是关于Maven - 根据属性激活子配置文件的主要内容,如果未能解决你的问题,请参考以下文章
Maven:配置文件激活取决于 localRepository 属性?