Gradle生成启动脚本必须使用application插件而非仅java插件;最小配置为声明plugins{id'application'}并指定带包名的mainClass,运行distZip任务后在build/distributions/下获取含bin/和lib/的可执行分发包。

Gradle 生成启动脚本靠的是 application 插件,不是 Java 插件本身。只启用 java 插件不会产生任何脚本——这点很多人在第一次打包可执行程序时会卡住。
为什么 run 任务能跑,但没看到 bin 目录?
run 是纯 JVM 启动,不生成脚本;真正生成 bin/ 下的 shell/bat 脚本,必须用 application 插件,并触发 distZip 或 distTar 任务。
- 只写
plugins { id 'java' }→ 永远不会有启动脚本 - 必须加
plugins { id 'application' },且配置mainClass -
gradle run和gradle distZip是两个完全独立的路径:前者调试用,后者交付用
application 插件怎么配才生效?
最小必要配置只有两处,缺一不可:
- 声明插件:
plugins { id 'application' } - 指定入口:
application { mainClass = 'com.example.Main' }(类名必须带包,不能是Main)
如果 mainClass 写错或类不存在,distZip 会成功,但解压后脚本执行时报 NoClassDefFoundError 或直接提示 “Could not determine java command”。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
生成的脚本在哪?怎么用?
运行 gradle distZip 后,压缩包在 build/distributions/ 下,解压即得完整结构:
myapp-1.0/
├── bin/
│ ├── myapp # Linux/macOS
│ └── myapp.bat # Windows
└── lib/
├── myapp-1.0.jar
└── ...依赖jar- 脚本名默认取自项目名(
rootProject.name),不是mainClass名 - Windows 下必须用
.bat,直接双击可能闪退;推荐命令行执行:bin\myapp.bat --args "hello" - Linux/macOS 脚本默认无执行权限,首次需
chmod +x bin/myapp
JVM 参数和 classpath 怎么控制?
脚本里的 JVM 启动参数来自两个地方,顺序很重要:
-
applicationDefaultJvmArgs:硬编码进脚本,如['-Xmx512m', '-Dfile.encoding=UTF-8'] - 用户在命令行传参时,
--args只传给 Java 主方法,不改 JVM 参数;要动态加 JVM 参数,得改脚本或用环境变量JAVA_OPTS - classpath 由插件自动生成,包含
lib/下所有 jar,无需手动拼接
注意:executableDir 可以把 bin/ 改成 scripts/,但改完要重新跑 distZip,旧脚本不会自动更新。

















