如何使用maven-antrun-plugin有条件地执行任务?

时间:2009-12-28 22:33:51

标签: maven-2 maven-antrun-plugin

我需要执行一些ant命令,具体取决于作为maven build命令的参数传入的环境变量。

目前我有3个任务块,只执行没有条件的任务块。

<tasks name="isProdCheck">
  <condition property="isProd">
    <equals arg1="${environment}" arg2="PROD" />
  </condition>
</tasks>

<tasks if="isProd" depends="isProdCheck">
...
</tasks>

<tasks>
... I am the only block executed
</tasks>

我做错了什么,有更好的方法吗?

4 个答案:

答案 0 :(得分:9)

首先,根据Maven 1.x网站,maven 1.x的当前稳定版本是1.1版,而不是1.4版。其次,没有AntRun插件版本1.7,据我所知,这是一个Maven 2插件。第三,你使用的语法看起来非常类似于Using Attributes,这也是关于Maven 2的。

所以,我可能会遗漏一些东西但是,这非常令人困惑,你应该在你的问题中澄清这些要点。

无论如何,正如你明确提到的Maven 1,我会试着回答。如果我记得很清楚,我会写一个自定义目标并使用Jelly的core:ifcore:when。为此,请在maven.xml中提供类似的内容:

<project xmlns:j="jelly:core" xmlns:ant="jelly:ant">
  <goal name="my-goal">
    <j:if test="${environment == 'PROD'}">
      <ant:xxx .../>
    </j:if>
  </goal>
</project>

我真的不确定语法,所有这些Maven 1的东西都太远了,我没有测试它(我懒得安装Maven 1)。但我想你会的。 scripting reference可能会对您有所帮助。

说实话,我真的希望你有充分的理由喜欢Maven 1.x而不是Maven 2.x:)

UPDATE:看来OP实际上正在使用Maven 2,所以我会相应地更新我的问题。要实现所需的行为,您可以使用Ant-contrib的if任务,如下所示:

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.3</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <tasks>
                <taskdef resource="net/sf/antcontrib/antcontrib.properties"
                  classpathref="maven.plugin.classpath" />
                <if>
                  <equals arg1="${foo}" arg2="bar" />
                  <then>
                    <echo message="The value of property foo is bar" />
                  </then>
                  <else>
                    <echo message="The value of property foo is not bar" />
                  </else>
                </if>
              </tasks>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>ant-contrib</groupId>
            <artifactId>ant-contrib</artifactId>
            <version>20020829</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>

然后拨打mvn compile -Dfoo=bar(这只是一个例子)。

但是,这一切并不是做事的“母亲方式”。现在我对你想要做的事情了解得更好(但并不完全是因为你没有解释你的最终目标),我认为使用build profiles会更合适,并且在阅读了你自己的答案后,我认为你已经过度复杂化(并且你走错了路)。

我知道你是Maven初学者,但我建议尝试使用它,而不是回到Ant上,否则你将无法获得它的好处。此外,在打开问题时,您应该更好地解答一般问题,而不是要求特定的解决方案。在这里,我无法提供更多指导,因为我不知道你真正想要实现的目标。

答案 1 :(得分:5)

根据plugin usage,您不需要在使用AntContrib代替maven-antrun-plugin 1.5的{​​{1}}之后使用<target>。此标记的工作方式与此相同,但在此标记中您可以添加类似下面示例的条件。

<tasks>

上面的代码总是执行第一个目标,但第二个目标依赖于属性值。您也可以为父项和子模块项目配置它,在<properties> <execute.my.target>true</execute.my.target> </properties> <build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>config</id> <phase>package</phase> <goals> <goal>run</goal> </goals> <configuration> <!-- this target will be executed always --> <target> <echo message="Hello there, I'm a simple target" /> </target> <!-- This target will be executed if and only if the property is set to true --> <target name="my-target" if="${execute.my.target}"> <echo message="Conditional target..." /> </target> </configuration> </execution> </executions> </plugin> </plugins> ... </build> 标签上定义插件并在子模块上调用一些属性,然后调用插件。

答案 2 :(得分:0)

通过在项目根目录的build.xml文件中创建具有“if”属性和condition属性的多个命名目标来解决此问题,如下所示。

      

<target name="prod" if="isProd" depends="isProdCheck">
    // do something
</target>

传递了我需要的命令行开关的属性,并从Maven POM的tasks部分调用build.xml文件中的ant目标,如下所示:

<tasks>
 <ant antfile="${basedir}/build.xml">
    <property name="environment" value="${environment}"/>        
    <target name="prod"/>
 </ant>          
</tasks>

答案 3 :(得分:0)

此处可运行的示例https://www.surasint.com/run-ant-with-if-from-maven/

另一种解决方案是:将ant-contrib-1.0b3.jar保存到路径中然后像这样定义

<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
        <pathelement location="${runningLocation}/ant-contrib-1.0b3.jar" />
    </classpath>
</taskdef>

然后

<target name="doSomething">
    <if>
        <equals arg1="${someProp}" arg2="YES" />
        <then>
            <echo message="It is YES" />
        </then>
        <else>
            <echo message="It is not YES" />
        </else>
    </if>
</target>

我在这里放了完整的代码示例,您可以下载https://www.surasint.com/2017/04/09/run-ant-with-if-from-maven/