application插件通过distZip生成含启动脚本的zip包,输出至build/distributions/,解压后含bin/(含.sh/.bat)、lib/(依赖JAR)和config/目录,支持JVM参数配置与外部配置热替换。

用 application 插件生成带启动脚本的 zip 包
Gradle 的 application 插件专为命令行 Java 应用设计,能自动把 class、依赖、JRE 路径(可选)、启动脚本一起打包进 zip 或 tar。它不生成单个 JAR,而是生成一个可解压即用的目录结构。
常见错误现象:直接运行 gradle build 后只在 build/libs/ 下看到普通 JAR,没有 bin 目录、没有脚本、无法双击或直接 ./app 运行——那是因为没启用 application 插件。
实操建议:
- 在
build.gradle中添加:plugins { id 'java' id 'application' } mainClassName = 'com.example.Main' - 执行
gradle distZip(Linux/macOS)或gradle distTar(macOS 默认 tar,Windows 建议用 zip) - 输出路径是
build/distributions/<project-name>-<version>.zip</version></project-name> - 解压后结构为:
bin/(含app和app.bat)、lib/(所有依赖 JAR)、config/(可手动放配置文件)
为什么不用 shadowJar 打 zip?
shadowJar 生成的是单个 fat JAR,适合 java -jar xxx.jar 场景;而 distZip 生成的是分发包,天然支持:自定义 JVM 参数(通过 bin/app 脚本)、外部配置文件热替换(如 config/application.properties)、多环境 profile 切换(配合 Spring Boot 的 --spring.profiles.active=prod)。
立即学习“Java免费学习笔记(深入)”;
容易踩的坑:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 没设
mainClassName→ 解压后bin/app脚本会报错 “Could not find or load main class” - 项目用了 JNI 或本地库(.so/.dll)→
distZip不会自动包含它们,需手动用applicationDistribution.from('libs/native') { into 'lib' }拷贝 - 想让脚本默认用特定 JDK → 在
applicationDefaultJvmArgs里加-Djava.home=/path/to/jdk,但注意这仅影响脚本内联调用,不改变系统 JAVA_HOME
如何把 resources 和 config 一起打进分发包
默认 distZip 只打包 build/classes 和 build/libs/*.jar,不会包含 src/main/resources 外的配置文件(比如运维要改的 logback.xml 或数据库地址)。
实操建议:
- 把外部配置文件放在
src/main/dist/config/目录下(非标准位置,避免和 classpath 冲突) - 在
build.gradle中追加:applicationDistribution.from('src/main/dist') { into 'config' } - 这样解压后,
config/就是独立目录,用户可随意编辑,不污染 jar 包 - Java 代码里读取时用
Paths.get("config/application.properties"),而非getClass().getResource()
distZip 和 installDist 的区别在哪
installDist 本质是 distZip 的“解压版”:它直接把分发内容展开到 build/install/<project-name>/</project-name>,方便本地快速测试;distZip 是把它再压缩成 zip 文件,用于交付。
性能与使用场景:
- CI/CD 流水线中应优先用
distZip,产出物明确、可校验、易归档 - 本地调试用
gradle installDist && build/install/myapp/bin/myapp更快,省去解压步骤 - 两者生成的内容完全一致,只是存放形式不同;不要同时依赖二者输出路径,容易混淆
真正容易被忽略的是:distZip 默认不校验主类是否存在字节码 —— 如果 mainClassName 写错包名或类名,直到解压运行才会报错。建议在 CI 中加一步 gradle classes && java -cp build/classes/java/main com.example.Main 提前验证。

















