针对 Maven 管理的SSM项目编写Ant 的 `build.xml` 模板,支持依赖管理、编译、打包 WAR 文件及部署到 Tomcat。

发布于:2025-04-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

针对 SSM(Spring + SpringMVC + MyBatis)项目build.xml 模板,支持依赖管理、编译、打包 WAR 文件及部署到 Tomcat。假设项目结构符合 Maven 约定(可调整目录路径):


SSM 项目目录结构

ssm-project/
├── src/
│   ├── main/
│   │   ├── java/          # Java 源码(Controller/Service/Dao 等)
│   │   ├── resources/     # 配置文件(spring, mybatis, properties 等)
│   │   └── webapp/        # Web 资源(JSP、CSS、JS)
│   │       ├── WEB-INF/
│   │       │   └── web.xml
│   │       └── static/    # 静态资源(CSS/JS/Images)
├── External Libraries/                   # Maven管理依赖 JAR(Spring/MyBatis/数据库驱动等)
├── build/                 # 构建输出目录
│   ├── classes/           # 编译后的类文件
│   └── ssm-project.war    # 生成的 WAR 文件
└── build.xml              # Ant 构建脚本

因为项目用的是Maven管理依赖,没有lib目录,需要使用Ant的Maven任务插件,例如ant-maven-plugin或Maven Ant Tasks,来解析pom.xml文件并自动下载依赖。将Maven的依赖库复制到Ant构建所需的目录中,比如lib目录,以便在构建时包含这些依赖。

步骤 1:准备 Maven Ant Tasks

  1. 下载插件
    前往 Maven Ant Tasks 官网 下载 maven-ant-tasks-2.1.3.jar(或最新版本)。

    Apache Download Mirrors

  2. 放置插件
    将下载的 JAR 文件放入项目根目录的 ant-lib 文件夹(需手动创建)。

关键配置说明

  1. Maven 依赖解析

    • 通过 artifact:pomartifact:dependencies 任务读取 pom.xml,自动下载所有 runtime 作用域的依赖到 build/lib 目录。
    • 首次运行需联网:依赖会从 Maven 中央仓库下载并缓存到本地仓库。
  2. 依赖路径管理

    • 编译时通过 dependency.classpath 引用所有依赖,无需手动维护 lib 目录。
    • WAR 打包时自动包含 build/lib 下的所有 JAR 文件。
  3. Tomcat 依赖处理

    • 显式添加 Tomcat 的 servlet-api.jar 到编译类路径(根据实际安装路径修改)。

步骤 2:配置 build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="SSMProject" default="deploy" basedir="."
         xmlns:artifact="antlib:org.apache.maven.artifact.ant">

    <!-- ========== 加载 Maven Ant Tasks ========== -->
    <taskdef resource="org/apache/maven/artifact/ant/antlib.xml"
             uri="antlib:org.apache.maven.artifact.ant"
             classpath="ant-lib/maven-ant-tasks-2.1.3.jar"/>

    <!-- ========== 属性配置 ========== -->
    <property name="src.dir" value="src/main/java"/>          <!-- Java 源码目录 -->
    <property name="resources.dir" value="src/main/resources"/><!-- 资源文件目录 -->
    <property name="web.dir" value="src/main/webapp"/>        <!-- Web 资源目录 -->
    <property name="build.dir" value="build"/>                <!-- 构建输出目录 -->
    <property name="classes.dir" value="${build.dir}/classes"/><!-- 编译目录 -->
    <property name="lib.dir" value="${build.dir}/lib"/>       <!-- 依赖库目录 -->
    <property name="war.file" value="${build.dir}/ssm-project.war"/><!-- WAR 文件名 -->

    <!-- Maven 本地仓库路径(默认 ~/.m2/repository,根据实际情况修改) -->
    <property name="maven.repo.local" value="E:\apache-maven\apache-maven-3.8.8\repo"/>

    <!-- Tomcat 部署路径 -->
    <property name="tomcat.webapps" value="E:\apache-tomcat\apache-tomcat-9.0.88\webapps"/>

    <!-- ========== 初始化目录 ========== -->
    <target name="init">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${classes.dir}"/>
        <mkdir dir="${lib.dir}"/>
    </target>

    <!-- ========== 解析 pom.xml 并下载依赖 ========== -->
    <target name="resolve-dependencies" depends="init">
        <!-- 读取 pom.xml 中的依赖 -->
        <artifact:pom id="project.pom" file="pom.xml"/>
        <artifact:dependencies pomRefId="project.pom"
                               useScope="compile"
                               filesetId="dependency.fileset"
                               pathId="dependency.classpath">
            <remoteRepository id="central"
                              url="https://maven.aliyun.com/repository/public"/>
            <localRepository path="${maven.repo.local}"/>
        </artifact:dependencies>

        <!-- 复制依赖到 lib 目录 -->
        <copy todir="${lib.dir}" flatten="true">
            <fileset refid="dependency.fileset"/>
        </copy>
    </target>

    <!-- ========== 编译 Java 代码 ========== -->
    <target name="compile" depends="resolve-dependencies">
        <javac srcdir="${src.dir}" destdir="${classes.dir}"
               source="1.8" target="1.8" encoding="UTF-8"
               includeantruntime="false">
            <classpath>
                <!-- 依赖库路径 -->
                <path refid="dependency.classpath"/>
                <!-- 添加 Tomcat 的 Servlet API -->
                <fileset dir="E:\apache-tomcat\apache-tomcat-9.0.88\lib">
                    <include name="servlet-api.jar"/>
                </fileset>
            </classpath>
        </javac>

        <!-- 复制所有资源文件到 classes 目录 -->
        <copy todir="${classes.dir}">
            <fileset dir="${resources.dir}">
                <include name="**/*.xml"/>      <!-- MyBatis/Spring 配置文件 -->
                <include name="**/*.properties"/><!-- 属性文件 -->
<!--                <include name="static/**/*"/>  &lt;!&ndash; 静态资源 &ndash;&gt;-->
<!--                <include name="templates/**/*"/>&lt;!&ndash; Thymeleaf 模板 &ndash;&gt;-->
            </fileset>
        </copy>
    </target>

    <!-- ========== 打包 WAR 文件 ========== -->
    <target name="war" depends="compile">
        <war destfile="${war.file}" webxml="${web.dir}/WEB-INF/web.xml">
            <!-- Web 资源(JSP/HTML/CSS/JS) -->
<!--            <fileset dir="${web.dir}">-->
<!--                <include name="**/*.*"/>-->
<!--            </fileset>-->
            <!-- 添加 Web 资源(JSP/HTML/CSS/JS) -->
            <fileset dir="${web.dir}">
                <include name="**/*.html"/>
                <include name="**/*.jsp"/>
                <include name="WEB-INF/**/*"/>    <!-- web.xml 等配置 -->
                <include name="static/**/*"/>     <!-- 静态资源(关键配置) -->
            </fileset>

            <!-- 编译后的类文件 -->
            <classes dir="${classes.dir}"/>

            <!-- 第三方依赖库 -->
            <lib dir="${lib.dir}"/>
        </war>
    </target>

    <!-- ========== 部署到 Tomcat ========== -->
    <target name="deploy" depends="war">
        <copy file="${war.file}" todir="${tomcat.webapps}"/>
        <echo message="WAR 文件已部署到 Tomcat,请重启服务器!"/>
    </target>

    <!-- ========== 清理构建产物 ========== -->
    <target name="clean">
        <delete dir="${build.dir}"/>
        <delete file="${tomcat.webapps}/ssm-project.war"/>
        <delete dir="${tomcat.webapps}/ssm-project"/>
    </target>

</project>

可能的问题

出现F:\code_space\2025\repo\testrepo\src\main\java\mms\pojo\ApiResponse.java:3: 错误: 程序包lombok不存在

Maven Ant Tasks没有正确解析依赖:可能依赖的作用域(scope)设置不正确,比如Lombok可能被声明为provided,导致在编译时没有被包含进去。


问题原因

错误 程序包lombok不存在 表明 Lombok 依赖未正确引入到编译类路径中。由于您的项目使用 Maven 管理依赖,但通过 Ant 构建,需确保以下两点:

  1. pom.xml 中已声明 Lombok 依赖
  2. Ant 的构建脚本正确解析并包含 Lombok 的 JAR 文件

解决方案

步骤 1:确认 pom.xml 包含 Lombok 依赖

<!-- pom.xml -->
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version> <!-- 使用最新版本 -->
        <scope>provided</scope> <!-- 若使用 IDEA/Eclipse,建议保留 provided -->
    </dependency>
</dependencies>

步骤 2:修改 Ant 的 build.xml

调整依赖解析的作用域(useScope),确保 Lombok 被包含到编译类路径中。

<!-- build.xml -->
<target name="resolve-dependencies" depends="init">
    <artifact:pom id="project.pom" file="pom.xml"/>
    <artifact:dependencies pomRefId="project.pom" 
                           useScope="compile" <!-- 关键修改:包含 compile  provided 依赖 -->
                           filesetId="dependency.fileset"
                           pathId="dependency.classpath">
        <remoteRepository id="central" 
            url="https://repo.maven.apache.org/maven2"/>
        <localRepository path="${maven.repo.local}"/>
    </artifact:dependencies>
    <copy todir="${lib.dir}" flatten="true">
        <fileset refid="dependency.fileset"/>
    </copy>
</target>

步骤 3:清理并重新构建

ant clean resolve-dependencies compile

启动方式

  1. idea 配置Ant工具启动
    在这里插入图片描述

  2. 可用命令行启动

ant -f build.xml

在这里插入图片描述

访问方式

war包会生成在tomcat/webapps下
在这里插入图片描述

启动tomcat

在这里插入图片描述
输入url(http://localhost:8080/ssm-project/)可成功访问在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到