如何通过Gradle在终端运行任意Java类的main方法?
如何在终端灵活运行Gradle项目中任意Java类的main方法
我懂你要的那种灵活劲儿——不用绑定固定主类,想跑哪个带main方法的类就跑哪个,完全不用依赖Application插件对吧?其实Gradle本身就有办法实现,和IDEA里自动生成Hoge.main()任务的效果本质是一样的,下面给你几个实用方案:
方案一:自定义通用运行任务(推荐)
这是最方便的方式,只需要在项目的build.gradle(Groovy DSL)或者build.gradle.kts(Kotlin DSL)里添加一个通用任务,之后就能随时指定任意类运行:
Groovy DSL 写法
task runClass(type: JavaExec) { // 自动关联main源码集的运行时类路径,包含项目所有依赖 classpath = sourceSets.main.runtimeClasspath // 通过项目属性接收要运行的主类全限定名 main = project.findProperty('mainClass') }
Kotlin DSL 写法
tasks.register<JavaExec>("runClass") { classpath = sourceSets.main.get().runtimeClasspath mainClass.set(project.findProperty("mainClass") as String?) }
添加完成后,在终端运行任意类的main方法只需要执行:
gradle runClass -PmainClass=com.yourpackage.Hoge
把com.yourpackage.Hoge换成你实际的类全限定名就行,想跑哪个类就换哪个,完全灵活。
方案二:直接用exec命令手动执行(无需修改构建脚本)
如果你不想改动构建脚本,也可以直接通过Gradle的exec任务,结合编译步骤来运行:
# 先编译项目,再执行指定类 gradle compileJava exec \ --executable java \ --args "-cp build/classes/java/main:build/resources/main com.yourpackage.Hoge"
注意:如果项目有第三方依赖,这个命令的类路径需要手动包含依赖jar包,不如方案一方便,适合临时快速测试简单类。
方案三:临时创建即时任务(一次性场景)
如果只是偶尔运行某个类,不想修改构建脚本,还可以用Gradle的即时任务功能临时创建一个运行任务:
gradle -PmainClass=com.yourpackage.Hoge \ -PdefineTask="task runTemp(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath; main = project.mainClass }" \ runTemp
这个命令会临时创建一个名为runTemp的JavaExec任务并执行,不用修改本地构建文件,适合临时使用。
补充说明
IDEA里自动生成的Hoge.main()任务,本质就是Gradle为每个带main方法的类自动创建的JavaExec任务,和我们自定义的runClass任务逻辑完全一致,只是IDEA帮你做了自动生成的工作。
内容的提问来源于stack exchange,提问作者kensuke1984
相关产品推荐
相关产品推荐

