Maven AntRun 插件详解

AntRun 插件只有一个插件目标:antrun:run ,提供了在 Maven 中运行 Ant 任务的能力。您甚至可以将 Ant 脚本嵌入 POM 中,但该插件的目的不是提供污染 POM 的方法,因此鼓励您将所有 Ant 任务移动到 build.xml 文件中的 <target/> 元素中,并使用 Ant 的 <ant/> 任务从 POM 调用它。这个插件的主要目的之一是促进从基于 Ant 的项目到 Maven 的迁移。一些项目目前可能无法迁移,因为它们依赖于 Maven 默认情况下不提供的自定义构建功能。

所有可选参数

  • <customTaskPrefix>。用于内置 Ant 任务的 xml 标签前缀。需要在 antrun target 配置中引用的每个任务前面加上此前缀。例如,前缀 mvn 表示 attachartifact 任务由 <mvn:attachartifact> 引用。空字符串的默认值表示任务不使用前缀。
  • <exportAntProperties>。指定是否应将 Ant properties 传播到 Maven properties。
  • <failOnError>。指定 Ant 构建中的失败是否会导致 Maven 构建失败。如果该值为 false,那么即使 Ant 构建失败,Maven 构建也将继续。如果该值为 true(默认),那么如果 Ant 构建失败,Maven 构建就会失败。
  • <propertyPrefix>。项目和依赖项属性名称前的字符串。
  • <skip>。指定是否应跳过 AntRun 的执行。
  • <target>。Ant 目标的 XML 内容。您可以在该元素中添加任何可以在 build.xml 文件中的 <target> 元素中可以添加的内容。
  • <versionsPropertyName>。包含所有依赖项版本列表的 property 的名称。这用于从文件名中删除版本。默认为 maven.project.dependencies.versions

示例

下面是一个使用 maven-antrun-plugin 插件的模板:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase> <!-- a lifecycle phase --> </phase>
            <configuration>
              <target>

                <!--
                  Place any Ant task here. You can add anything
                  you can add between <target> and </target> in a
                  build.xml.
                -->

              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

此外,您可以通过复制 <execution/> 部分并指定一个新阶段,向每个生命周期阶段添加脚本。最后,您可以在 <target/> 元素中指定一些 Ant <target/> property。仅未包装 Ant <target/> 中的 dependens attribute。

[...]
<configuration>
  <target name="The name of the target"
    if="The name of the property that must be set in order for this task"
    unless="The name of the property that must NOT be set in order for this task"
    description="A short description of this target's function">

    <!--
      Place any Ant task here. You can add anything
      you can add between <target> and </target> in a
      build.xml.
    -->

  </target>
<configuration>
[...]

Maven 可用的所有 property 在 target 配置中也可用。但是,您可能希望使用 Ant 任务调用外部 Ant 构建脚本。为了避免名称冲突,只将 properties 的子集(而不是全部)传递给外部 Ant 构建。这些包括 POM properties 部分中定义的所有 property。它还包括一些常用 Maven property 的前缀版本。

  maven.project.groupId
  maven.project.artifactId
  maven.project.name
  etc.

如果要使用的 Maven property 在外部文件中不可用,则必须在调用 Ant 之前重新定义该 property。

  <property name="maven.project.url" value="${project.url}"/>
  <ant antfile="build.xml"/>

一些 Ant 表达式在 Maven 中有各自的对应功能。因此,可以简单地调用对应的 Maven 功能,而不是使用 Maven AntRun 插件,以避免不必要的开销。

Ant 功能 对应的Maven功能
内置任务
Ant maven-antrun-plugin
AntCall maven-antrun-plugin
Available profiles
BUnzip2 maven-assembly-plugin
BZip2 maven-assembly-plugin
Chmod maven-assembly-plugin
Condition profiles
Copy maven-resources-plugin
Dependset maven-dependency-plugin
Ear maven-ear-plugin
Filter maven-resources-plugin Note: Filter uses the @...@ token while maven-resources-plugin uses the $... token
FixCRLF maven-resources-plugin
GenKey maven-jar-plugin
GUnzip maven-assembly-plugin
GZip maven-assembly-plugin
Jar maven-jar-plugin
Javac maven-compiler-plugin
Javadoc/Javadoc2 maven-javadoc-plugin
LoadProperties maven-resources-plugin
Manifest maven-jar-plugin
Property maven-resources-plugin
Replace maven-resources-plugin Note: Replace can specify its token while maven-resources-plugin uses the $... token
Tar maven-assembly-plugin
Unjar maven-assembly-plugin
Untar maven-assembly-plugin
Unwar maven-assembly-plugin
Unzip maven-assembly-plugin
War maven-war-plugin
Zip maven-assembly-plugin
可选任务
Antlr maven-antlr-plugin
Depend maven-dependency-plugin
EJB Tasks maven-ejb-plugin
FTP maven-deploy-plugin Note: maven-deploy-plugin can only deploy unto the FTP
JavaCC maven-compiler-plugin
JJDoc maven-compiler-plugin
JJTree maven-compiler-plugin
JUnit maven-surefire-plugin
JUnitReport maven-surefire-report-plugin
ServerDeploy maven-deploy-plugin
Setproxy maven-deploy-plugin
Translate maven-resources-plugin Note: Translate can specify its own tokens and can have a different encoding scheme for reading and writing files. maven-resources-plugin however uses the $... annotation only and has only one encoding scheme for reading and writing

引用 Maven 类路径

在 Ant 构建中为每个项目依赖项设置一个属性。每个属性名称都使用格式 groupId:artifactId:type[:classifier]。例如,要使用 groupId 为 org.apache 、artifactId 为 common-util 的 依赖 jar 的路径,可以使用以下命令。

<echo message="${org.apache:common-util:jar}"/> 

如果依赖项包括 classifer,则 classifer 将附加到 property 名称。例如,groupId 为 org.apache、artifactId 为 common-util、类型为 jar 和 classifer 为 jdk14。

<echo message="${org.apache:common-util:jar:jdk14}"/> 

从 3.0.0 版本起,不支持旧格式 maven.dependency.groupId.artifactId[.classifier].type.path

您还可以使用以下类路径引用:

  • maven.compile.classpath
  • maven.runtime.classpath
  • maven.test.classpath
  • maven.plugin.classpath

例如,要使用 antrun 显示 Maven 的类路径,我们可以这样做:

<project>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-test-app</artifactId>
  <groupId>my-test-group</groupId>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>compile</id>
            <phase>compile</phase>
            <configuration>
              <target>
                <property name="compile_classpath" refid="maven.compile.classpath"/>
                <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                <property name="test_classpath" refid="maven.test.classpath"/>
                <property name="plugin_classpath" refid="maven.plugin.classpath"/>

                <echo message="compile classpath: ${compile_classpath}"/>
                <echo message="runtime classpath: ${runtime_classpath}"/>
                <echo message="test classpath:    ${test_classpath}"/>
                <echo message="plugin classpath:  ${plugin_classpath}"/>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

或者,我们也可以使用外部 build.xml。

<project>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-test-app</artifactId>
  <groupId>my-test-group</groupId>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>compile</id>
            <phase>compile</phase>
            <configuration>
              <target>
                <property name="compile_classpath" refid="maven.compile.classpath"/>
                <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                <property name="test_classpath" refid="maven.test.classpath"/>
                <property name="plugin_classpath" refid="maven.plugin.classpath"/>

                <ant antfile="${basedir}/build.xml">
                  <target name="test"/>
                </ant>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

build.xml

<?xml version="1.0"?>
<project name="test6">
    <target name="test">
      <echo message="compile classpath: ${compile_classpath}"/>
      <echo message="runtime classpath: ${runtime_classpath}"/>
      <echo message="test classpath:    ${test_classpath}"/>
      <echo message="plugin classpath:  ${plugin_classpath}"/>
    </target>
</project>

使用 <target/> attribute

您可以在 <target/> 配置中指定 attributes 来执行或不执行 Ant 任务,具体取决于某些条件。例如,要跳过 Ant 调用,可以添加以下内容:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase> <!-- a lifecycle phase --> </phase>
            <configuration>
              <target unless="maven.test.skip">
                <echo message="To skip me, just call mvn -Dmaven.test.skip=true"/>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

使用 Ant 默认 jar 中未包含的任务

要使用 Ant jar 中未包含的 Ant 任务,如 Ant 可选任务或自定义任务,您需要将任务运行所需的依赖项添加到插件类路径,并在需要时使用maven.plugin.classpath 引用。

<project>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-test-app</artifactId>
  <groupId>my-test-group</groupId>
  <version>1.0-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>ftp</id>
            <phase>deploy</phase>
            <configuration>
              <target>
                <ftp action="send" server="myhost" remotedir="/home/test" userid="x" password="y" depends="yes" verbose="yes">
                  <fileset dir="${project.build.directory}">
                    <include name="*.jar" />
                  </fileset>
                </ftp>
                <taskdef name="myTask" classname="com.acme.MyTask" classpathref="maven.plugin.classpath"/>
                <myTask a="b"/>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>1.4.1</version>
          </dependency>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-commons-net</artifactId>
            <version>1.8.1</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容