我希望获得以下行为:当我为属性“my.prop”指定值时,我希望执行依赖插件和清理插件。如果没有为该属性指定值,我希望跳过它们。
我创建了这样的“my.prop”:
<properties>
<my.prop></my.prop>
</properties>
然后我读到配置文件激活只对系统属性有效,所以我删除了上面的内容,并使用了surefire插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<systemPropertyVariables>
<my.prop></my.prop>
</systemPropertyVariables>
</configuration>
</plugin>
我试着使用个人资料,如下所示:
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<skipDependecyAndCleanPlugins>false</skipDependecyAndCleanPlugins>
</properties>
</profile>
<profile>
<id>skip-dependency-and-clean-plugins</id>
<activation>
<property>
<name>my.prop</name>
<value></value>
<!-- I also tried: <value>null</value> without success.-->
</property>
</activation>
<properties>
<skipDependecyAndCleanPlugins>true</skipDependecyAndCleanPlugins>
</properties>
</profile>
</profiles>
稍后,对于每个插件,我都会这样做:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<configuration>
<skip>${skipDependecyAndCleanPlugins}</skip>
</configuration>
....
</plugin>
但是插件仍然会被执行。
当“my.prop”为空/空时,我如何确定Maven跳过插件的执行?
4条答案
按热度按时间xesrikrc1#
最简单的解决方案是使用以下形式的激活:
上面的内容意味着您可以为DEBUG定义任何值,这意味着
-Ddebug
就足够了。不能在POM文件中定义空值,因为
<value></value>
等同于<value/>
,这意味着与未定义的值相同。更新:
我建议使用个人资料,而不是房产。因此,您可以简单地在命令行上定义MVN-Pxyz安装或保留它。
lymgl2op2#
您可以在插件的配置中使用
my.prop
属性:现在当您执行以下命令时:
则将跳过插件
zbdgwd5y3#
你们很接近了。您可以通过在配置文件激活中使用
!my.prop
语法来实现您所描述的内容。根据Maven documentation,当根本没有定义系统属性
my.prop
时,将激活skip-dependency-and-clean-plugins
配置文件。gajydyqb4#
这里有一个直接满足OP的原始请求的解决方案:如果没有定义POM属性(不是系统属性)
my.prop
,则可以跳过插件的执行。该解决方案依赖于Apache Maven Help Plugin。这是一个杂乱无章的东西,但考虑到Maven缺乏表达能力,这大概是你能得到的最好的了。至少它依赖于一个广为人知的、有望得到维护的插件,而且应该100%都能工作。哦,它可能会让你的头爆炸。或者让你哭。或者两者兼而有之。我已经警告过你了。1.首先在
<build><pluginManagement>
部分声明最新版本的Maven帮助插件:1.然后在
<build><plugins>
小节中添加这个“秘制酱”,这将检查是否定义了my.prop
:1.现在您有了一个名为
is-skip
的POM属性(而不是系统属性),您可以在以后的任何阶段使用它来禁用插件--前提是插件具有接受布尔值的<skip>
或类似选项。如果根本没有定义my.prop
,则将is-skip
设置为true
;否则,将is-skip
设置为false
。有一点需要注意:根本不要定义
my.prop
,甚至不要定义空字符串,否则此解决方案将认为它已定义,并将is-skip
设置为false
。如果设置了my.prop
但为空,则将is-skip
设置为true
将需要上面的附加regex求值子句。对于我的用例,我不需要它,因为空的my.prop
是无效的,而且我在父POM中根本没有定义my.prop
。我会让你来理解它是如何工作的(当我写这篇文章的时候,我的头已经爆炸了),但我很乐意回答任何问题。
在上面的步骤2中,确保将两个正则表达式求值放在不同的阶段,例如这里使用的
validate
和initialize
。原因是,如果您在同一阶段将相同的插件混合在子POM中,Maven会感到困惑,并可能扰乱执行顺序。(请参见MNG-5987。)我杂乱无章的解决方案取决于评估的顺序。