可在Gradle中通过JavaExec任务动态运行指定Main类:使用-PmainClass=xxx传参,build.gradle中用project.findProperty("mainClass")读取并设为mainClass,classpath设为sourceSets.main.runtimeClasspath,支持带参数运行。

在 Gradle 中,可以通过配置 JavaExec 任务来动态运行指定的 Main 类,无需每次修改脚本——关键是把主类名作为任务参数或项目属性传入。
用 project property 传入主类名
这是最常用且灵活的方式。在命令行中通过 -PmainClass=xxx 指定主类,build.gradle 中读取并注入到 JavaExec 任务:
- 在
build.gradle中定义一个可配置的JavaExec任务(比如叫runMain) - 用
mainClass = project.findProperty("mainClass") ?: "default.Main"动态设置入口类 - 确保 classpath 包含编译输出和依赖:
classpath = sourceSets.main.runtimeClasspath
示例配置:
tasks.register<JavaExec>("runMain") {
mainClass.set(project.findProperty("mainClass") as String? ?: "com.example.Demo")
classpath = sourceSets.main.runtimeClasspath
// 可选:传参给 Main 方法
if (project.hasProperty("appArgs")) {
args(project.property("appArgs").toString().split(","))
}
}
运行时执行:./gradlew runMain -PmainClass=com.example.MyApp
或带参数:./gradlew runMain -PmainClass=com.example.CliApp -PappArgs="--port,8080,--debug
支持多个预设 Main 类的便捷任务
如果常跑几个固定类,可以提前注册多个命名任务,复用同一套逻辑:
立即学习“Java免费学习笔记(深入)”;
- 为每个常用 Main 类注册独立任务,如
runServer、runWorker - 每个任务内部直接写死
mainClass.set("..."),避免每次输参数 - 也可统一委托给一个模板任务,用
doFirst动态覆盖
例如:
tasks.register<JavaExec>("runServer") {
mainClass.set("com.example.Server")
classpath = sourceSets.main.runtimeClasspath
}
tasks.register<JavaExec>("runWorker") {
mainClass.set("com.example.Worker")
classpath = sourceSets.main.runtimeClasspath
}
注意 classpath 和模块路径(Java 9+)
若项目使用 Java 9+ 且启用了模块系统,仅靠 runtimeClasspath 不够:
- 需要显式设置
modularity.inferModulePath.set(true)(Gradle 7.4+) - 或手动添加
--module-path和--add-modules参数(通过jvmArgs) - 普通非模块化项目无需额外操作,
runtimeClasspath已足够
调试与常见问题
运行失败时优先检查这几项:
-
类名拼写是否完整:必须是全限定名(如
com.example.Main),不能是相对路径或文件名 -
类是否已编译:确保先执行
compileJava,或让runMain依赖它:dependsOn("classes") -
依赖是否缺失:若 Main 类引用了未声明的库,会报
NoClassDefFoundError,确认runtimeClasspath正确包含所有 jar -
IDE 缓存干扰:IntelliJ 有时不识别动态
mainClass,建议直接命令行运行验证


















