导读:本期聚焦于小团团创作的《Spring Boot整合Ant实现传统方式构建打包的完整步骤详解》,敬请观看详情。Maven和Gradle早已成为Java项目构建的主流选择,但Ant并没有退出历史舞台。在一些遗留系统维护、内网环境无法联网拉取依赖、或者需要对构建过程做精细化控制的场景下,Ant依然是可靠的选择。本文将围绕如何在Spring Boot项目中引入Ant构建展开,内容涵盖build.xml的核心配置、spring-boot-antlib扩展库的用法、可执行fat jar的打包细节、以及与Maven构建结果的对比。同时还会分析Ant构建Spring Boot应用时常见的清单文件配置错误、依赖缺失等问题的排查方法,帮助你掌握这套传统但实用的构建方案。

Ant是Apache基金会推出的老牌构建工具,基于XML描述构建过程,虽然如今大部分新项目都使用Maven或Gradle,但在不少传统企业环境中,Ant构建脚本依然承担着日常的打包发布工作。Spring Boot官方其实也照顾到了这部分用户,提供了一个名为spring-boot-antlib的Ant扩展库,让Ant也能顺利构建出可执行jar。本文将完整讲解如何为Spring Boot项目编写Ant构建脚本,包括依赖准备、build.xml编写、打包配置和常见问题处理。

Spring Boot整合Ant实现传统方式构建打包的完整步骤详解

一、准备工作:项目结构与依赖库获取

在开始编写Ant脚本之前,需要先确认项目结构。为了让示例更贴近实际,这里假设项目采用标准的Maven目录布局:源代码放在src\main\java下,资源文件放在src\main\resources下,输出的class文件编译到target\classes目录。这种布局的好处是,如果团队中同时存在Maven和Ant两套构建方式,目录结构可以完全复用,不需要做额外调整。

Ant本身不负责依赖管理,这是它与Maven最大的区别。要让Ant构建Spring Boot项目成功,需要先把依赖jar准备好。有两种常见做法:第一种是通过Maven先执行一次mvn dependency:copy-dependencies,把所有依赖复制到target\dependency目录,之后Ant构建时直接引用这个目录;第二种是在内网手工维护一个lib目录,把需要的jar统一放进去。第二种方式在内网无外网访问权限的环境里非常常见,虽然维护成本高一些,但胜在稳定可控。

除了项目依赖之外,还需要下载spring-boot-antlib这个扩展包。它可以在Maven中央仓库中找到,坐标为org.springframework.boot:spring-boot-antlib。这个包提供了<springboot:exejar>等任务,专门用来生成Spring Boot要求的可执行jar格式,能省去手工编写MANIFEST.MF和处理嵌套jar的麻烦。

二、编写build.xml:编译与资源处理

build.xml是Ant构建的核心。首先需要定义几个基础任务:clean清理输出目录、compile编译源码、copy-resources复制资源文件。下面是一个可以直接使用的完整脚本框架:

<?xml version="1.0" encoding="UTF-8"?>
<project name="springboot-ant-demo" default="build" basedir=".">

    <property name="src.dir" value="src/main/java"/>
    <property name="res.dir" value="src/main/resources"/>
    <property name="build.dir" value="target"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="lib.dir" value="target/dependency"/>
    <property name="antlib.jar" value="lib/spring-boot-antlib-2.7.18.jar"/>

    <path id="compile.classpath">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </path>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile" depends="clean">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}"
               source="1.8" target="1.8" encoding="UTF-8"
               includeantruntime="false">
            <classpath refid="compile.classpath"/>
        </javac>
    </target>

    <target name="copy-resources" depends="compile">
        <copy todir="${classes.dir}">
            <fileset dir="${res.dir}"/>
        </copy>
    </target>

</project>

这个脚本里有几个容易踩坑的地方。首先是encoding="UTF-8"必须显式指定,否则在Windows环境下编译含中文注释的源码时会出现乱码甚至编译失败。其次是includeantruntime="false",加上它可以避免Ant自身的jar被混入编译classpath,减少不必要的干扰。最后是sourcetarget的设置,要与项目的JDK版本保持一致,如果团队用的是JDK 11或17,记得同步修改这里。

资源文件的复制经常被忽略。Spring Boot应用的application.yml、静态页面、MyBatis的mapper XML等都存放在resources目录下,如果不执行复制,打出来的jar启动时会直接报找不到配置的错误。上面的copy-resources任务把整个resources目录原样复制到classes目录,保持了与Maven一致的行为。

三、使用spring-boot-antlib打包可执行jar

接下来是最关键的一步:打包成Spring Boot认可的可执行fat jar。Spring Boot的可执行jar有特殊的目录结构,BOOT-INF\classes存放应用类,BOOT-INF\lib存放依赖jar,META-INF下的MANIFEST.MF要指定Main-Classorg.springframework.boot.loader.JarLauncher,并通过Start-Class指明真正的业务启动类。手工用Ant的jar任务拼出这个结构是可以的,但繁琐且容易出错,推荐直接使用spring-boot-antlib。

使用之前要先声明命名空间并引入任务定义,然后在打包任务中指定入口类和依赖路径,完整示例如下:

<project xmlns:springboot="antlib:org.springframework.boot.ant"
         name="springboot-ant-demo" default="build" basedir=".">

    <!-- 前面的property和path定义与上面相同,此处省略 -->

    <target name="boot-jar" depends="copy-resources">
        <springboot:exejar destfile="${build.dir}/demo-app.jar"
                          mainclass="com.example.DemoApplication">
            <springboot:resources>
                <fileset dir="${classes.dir}"/>
            </springboot:resources>
            <lib>
                <fileset dir="${lib.dir}"/>
                <pathelement location="${antlib.jar}"/>
            </lib>
        </springboot:exejar>
    </target>

    <target name="build" depends="boot-jar"/>

</project>

<springboot:exejar>任务会自动完成所有格式处理:生成正确的MANIFEST.MF、把业务类放入BOOT-INF\classes、把依赖放进BOOT-INF\lib,并且按Spring Boot的要求对嵌套jar的存储格式做处理(这一点很重要,Spring Boot 1.4之后要求嵌套jar必须以无压缩方式存储,普通jar任务做不到)。打包完成后,直接执行java -jar target\demo-app.jar即可启动应用。

需要特别说明的是<lib>部分的配置。spring-boot-antlib要求打包任务自身所在的类路径上要有spring-boot-loader相关类,通常把spring-boot-antlib的jar一并加入即可满足。如果构建时抛出ClassNotFoundException,且缺的类名以org.springframework.boot.loader开头,基本可以确定就是这个原因,把antlib的jar加进lib集合就能解决。

四、常见问题排查与替代方案

实际使用中问题主要集中在几类。第一类是打包成功但启动报错no main manifest attribute,这说明jar没有按照Spring Boot格式生成,多半是没有使用<springboot:exejar>而是用了普通jar任务,检查打包任务的写法即可。第二类是启动时找不到依赖类,通常是lib目录中的依赖不全,可以对比Maven构建的BOOT-INF\lib目录内容,逐一补齐缺失的jar。第三类是配置文件不生效,检查resources目录是否被正确复制进了打包范围。

还有一种情况是团队不想引入spring-boot-antlib,这时可以退而求其次,用普通jar任务手工构造清单文件,把Main-Class写为JarLauncher,再通过zipfileset把依赖以STORED方式压入BOOT-INF\lib。这种方式可行但代码量更大,而且要小心处理压缩方式,一般只建议在无法引入额外jar的极端受限环境下使用。

最后补充一点工程实践建议:如果项目还处于活跃开发阶段,开发时继续用Maven管理依赖、本地调试,只在发布环节用Ant执行打包,两套工具各司其职,是维护成本最低的组合方式。Ant构建脚本可以纳入版本管理,配合Jenkins等CI工具的Ant插件,就能实现完整的自动化发布流水线。整体来看,Ant构建Spring Boot应用虽然步骤多一些,但过程完全透明可控,非常适合对构建有严格审计要求的场景。

Spring BootAnt构建构建打包修改时间:2026-09-14 08:34:41

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260914/56574.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。