1. 概述

Maven 和 Ant 都是 Java 生态中广为人知的构建自动化工具。虽然大多数项目只会选择其一,但在某些场景下,两者结合使用反而更合理

✅ 典型场景:接手一个老旧的 Ant 项目,想逐步迁移到 Maven,但又不想一次性重写所有构建逻辑。这时候保留部分关键 Ant 任务,通过 Maven 统一调度,就是一种简单粗暴且安全的过渡方案。

本文将介绍如何通过 Maven Antrun Plugin 实现这一目标。


2. Maven Antrun Plugin 简介

Maven Antrun Plugin 的作用是在 Maven 构建流程中嵌入执行 Ant 任务。

⚠️ 虽然这个插件长期未更新(最新版仍是 1.8),但在实际项目中依然稳定可用,尤其适合过渡期的混合构建需求。

2.1 插件引入

pom.xml 中添加插件声明即可:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <!-- 具体执行配置 -->
    </executions>
</plugin>

📌 插件最新版本可参考 Maven Central


2.2 配置插件执行(executions)

和其他 Maven 插件一样,Antrun 插件也需要通过 <executions> 定义何时执行。

下面这个例子展示了:在 package 阶段,将生成的 JAR 包打包成 ZIP 文件。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <id>zip-artifacts</id>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <zip destfile="${project.basedir}/package.zip" 
                         basedir="${project.build.directory}" 
                         includes="*.jar" />
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

执行命令:

mvn package

✅ 由于插件绑定到了 package 阶段,所以运行 mvn package 时会自动触发 ZIP 打包操作。

📌 注意:<target> 标签内是标准 Ant 语法,可以直接使用 Ant 的所有内置任务(如 copydeletemkdirexec 等)。


3. 使用外部 build.xml 文件

除了直接在 pom.xml 写 Ant 任务,Antrun 插件还支持调用独立的 build.xml 文件,这对已有 Ant 脚本的项目非常友好。

3.1 示例 build.xml

假设项目根目录下有一个 build.xml,用于将 ZIP 文件上传到 FTP 服务器:

<project name="MyProject" default="dist" basedir=".">
   <description>项目构建脚本</description>

    <target name="ftpArtifact">
        <ftp 
          server="${ftp.host}" 
          userid="${ftp.user}" 
          password="${ftp.password}">
            <fileset dir="${project.basedir}">
                <include name="**/*.zip" />
            </fileset>
        </ftp>
    </target>
</project>

⚠️ 注意:<ftp> 是 Ant 的可选任务(optional task),默认不在 ant.jar 中,需要额外引入依赖。


3.2 插件配置调用 build.xml

pom.xml 中配置插件执行,调用外部 build.xmlftpArtifact 目标:

<execution>
    <id>deploy-artifact</id>
    <phase>install</phase>
    <goals>
        <goal>run</goal>
    </goals>
    <configuration>
        <target>
            <ant antfile="${basedir}/build.xml">
                <target name="ftpArtifact"/>
            </ant>
        </target>
    </configuration>
</execution>

📌 关键点:

  • 使用 <ant antfile="..."> 指定外部构建文件
  • 通过 <target name="..."/> 指定要执行的目标

同时,必须添加 FTP 任务所需的依赖:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <!-- 上面的 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>

执行命令:

mvn install

✅ 构建会走到 install 阶段时,自动加载 build.xml 并执行 ftpArtifact 任务。

💡 小贴士:FTP 凭据可通过 settings.xml 或命令行 -Dftp.user=admin -Dftp.password=secret 传入,避免硬编码。


4. 总结

通过 Maven Antrun Plugin,我们可以在 Maven 项目中灵活调用 Ant 任务,无论是内联脚本还是复用现有 build.xml,都能轻松实现。

✅ 适用场景:

  • 老项目从 Ant 向 Maven 迁移
  • 团队部分成员熟悉 Ant,保留已有脚本
  • 某些特殊构建步骤(如 FTP 上传、复杂文件处理)Ant 更简洁

❌ 不建议长期使用:

  • Antrun 插件功能单一,维护性不如原生 Maven 插件
  • 混合构建逻辑可能增加理解成本

📌 最终目标仍是尽可能将构建逻辑统一到 Maven 或 Gradle 中,但 Antrun 提供了一个平滑过渡的桥梁。

想了解更多构建工具对比?推荐阅读我们的 《Ant、Maven 与 Gradle 对比分析》 一文。


原始标题:Run an Ant Task with Maven