Maven-如果属性为空/空,则跳过插件

vxqlmq5t  于 2022-10-26  发布在  Maven
关注(0)|答案(4)|浏览(217)

我希望获得以下行为:当我为属性“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跳过插件的执行?

xesrikrc

xesrikrc1#

最简单的解决方案是使用以下形式的激活:

<profiles>
  <profile>
    <activation>
      <property>
        <name>debug</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>

上面的内容意味着您可以为DEBUG定义任何值,这意味着-Ddebug就足够了。
不能在POM文件中定义空值,因为<value></value>等同于<value/>,这意味着与未定义的值相同。

更新:

我建议使用个人资料,而不是房产。因此,您可以简单地在命令行上定义MVN-Pxyz安装或保留它。

lymgl2op

lymgl2op2#

您可以在插件的配置中使用my.prop属性:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <skip>${my.prop}</skip>
    </configuration>
    ....
</plugin>

现在当您执行以下命令时:

mvn ... -Dmy.prop=true

则将跳过插件

zbdgwd5y

zbdgwd5y3#

你们很接近了。您可以通过在配置文件激活中使用!my.prop语法来实现您所描述的内容。

<build>
  <plugins>
    <plugin>
      <artifactId>maven-clean-plugin</artifactId>
      <configuration>
        <skip>${skipDependecyAndCleanPlugins}</skip>
      </configuration>
    </plugin>
  </plugins>
</build>

<profiles>
  <profile>
    <id>skip-dependency-and-clean-plugins</id>
    <activation>
      <property>
        <name>!my.prop</name>
      </property>
    </activation>
    <properties>
      <skipDependecyAndCleanPlugins>true</skipDependecyAndCleanPlugins>
    </properties>
  </profile>
</profiles>

根据Maven documentation,当根本没有定义系统属性my.prop时,将激活skip-dependency-and-clean-plugins配置文件。

gajydyqb

gajydyqb4#

这里有一个直接满足OP的原始请求的解决方案:如果没有定义POM属性(不是系统属性)my.prop,则可以跳过插件的执行。该解决方案依赖于Apache Maven Help Plugin。这是一个杂乱无章的东西,但考虑到Maven缺乏表达能力,这大概是你能得到的最好的了。至少它依赖于一个广为人知的、有望得到维护的插件,而且应该100%都能工作。哦,它可能会让你的头爆炸。或者让你哭。或者两者兼而有之。我已经警告过你了。
1.首先在<build><pluginManagement>部分声明最新版本的Maven帮助插件:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>3.3.0</version>
</plugin>

1.然后在<build><plugins>小节中添加这个“秘制酱”,这将检查是否定义了my.prop

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>set-is-skip-true-or-prefixed</id>
      <phase>validate</phase>
      <goals>
        <goal>regex-property</goal>
      </goals>
      <configuration>
        <name>is-skip</name>
        <value>_${my.prop}</value>
        <regex>_\$\{my.prop\}</regex>
        <replacement>true</replacement>
        <failIfNoMatch>false</failIfNoMatch>
      </configuration>
    </execution>
    <execution>
      <id>set-is-skip</id>
      <phase>initialize</phase>
      <goals>
        <goal>regex-property</goal>
      </goals>
      <configuration>
        <name>is-skip</name>
        <value>${is-skip}</value>
        <regex>_.*</regex>
        <replacement>false</replacement>
        <failIfNoMatch>false</failIfNoMatch>
      </configuration>
    </execution>
  </executions>
</plugin>

1.现在您有了一个名为is-skip的POM属性(而不是系统属性),您可以在以后的任何阶段使用它来禁用插件--前提是插件具有接受布尔值的<skip>或类似选项。如果根本没有定义my.prop,则将is-skip设置为true;否则,将is-skip设置为false

<plugin>
  <groupId>org.example</groupId>
  <artifactId>foobar-plugin</artifactId>
  <executions>
    <execution>
      <id>foo</id>
      <phase>package</phase>
      <goals>
        <goal>foo</goal>
      </goals>
      <configuration>
        <skip>${is-skip}</skip>
      </configuration>
    </execution>
  </executions>
</plugin>

有一点需要注意:根本不要定义my.prop,甚至不要定义空字符串,否则此解决方案将认为它已定义,并将is-skip设置为false。如果设置了my.prop但为空,则将is-skip设置为true将需要上面的附加regex求值子句。对于我的用例,我不需要它,因为空的my.prop是无效的,而且我在父POM中根本没有定义my.prop
我会让你来理解它是如何工作的(当我写这篇文章的时候,我的头已经爆炸了),但我很乐意回答任何问题。
在上面的步骤2中,确保将两个正则表达式求值放在不同的阶段,例如这里使用的validateinitialize。原因是,如果您在同一阶段将相同的插件混合在子POM中,Maven会感到困惑,并可能扰乱执行顺序。(请参见MNG-5987。)我杂乱无章的解决方案取决于评估的顺序。

相关问题