Gradle运行Java main方法
1. 简介
在本教程中,我们将探索使用 Gradle执行Javamain方法的不同方法。
2. Java main方法
我们可以通过多种方式使用 Gradle运行 Java main方法。让我们使用一个将消息打印到标准输出的简单程序仔细查看它们:
public class MainClass {
public static void main(String[] args) {
System.out.println("Goodbye cruel world ...");
}
}
3. 使用应用程序插件运行
Application 插件是一个核心 Gradle 插件,它定义了一组即用型任务,可帮助我们打包和分发我们的应用程序。
让我们首先在build.gradle文件中插入以下内容:
plugins {
id "application"
}
apply plugin : "java"
ext {
javaMainClass = "com.blogdemo.gradle.exec.MainClass"
}
application {
mainClassName = javaMainClass
}
该插件会自动生成一个名为run的任务,只需要我们将其指向main类。第 9 行的闭包正是这样做的,它允许我们触发任务:
~/work/blogdemo/tutorials/gradle-java-exec> ./gradlew run
> Task :run
Goodbye cruel world ...
BUILD SUCCESSFUL in 531ms
2 actionable tasks: 1 executed, 1 up-to-date
4. 使用JavaExec任务运行
接下来,让我们在JavaExec任务类型的帮助下实现一个运行main方法的自定义任务:
task runWithJavaExec(type: JavaExec) {
group = "Execution"
description = "Run the main class with JavaExecTask"
classpath = sourceSets.main.runtimeClasspath
main = javaMainClass
}
我们需要在第 5 行定义main类,另外还要指定类路径。类路径是根据构建输出的默认属性计算的,并且包含编译类实际放置的正确路径。
请注意,在每种情况下,我们都使用main类的完全限定名称,包括包。
让我们使用JavaExec运行我们的示例:
~/work/blogdemo/tutorials/gradle-java-exec> ./gradlew runWithJavaExec
> Task :runWithJavaExec
Goodbye cruel world ...
BUILD SUCCESSFUL in 526ms
2 actionable tasks: 1 executed, 1 up-to-date
5. 使用Exec任务运行
最后,我们可以使用基本的Exec任务类型来执行我们的*主类。*由于此选项为我们提供了以多种方式配置执行的可能性,让我们实现三个自定义任务并单独讨论它们。
5.1.从编译的构建输出运行
首先,我们创建一个行为类似于JavaExec的自定义Exec任务:
task runWithExec(type: Exec) {
dependsOn build
group = "Execution"
description = "Run the main class with ExecTask"
commandLine "java", "-classpath", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass
}
我们可以运行任何可执行文件(在本例中为 java)并传递必要的参数以使其运行。
我们在第 5 行配置了类路径并指向我们的main类,我们还在第 2 行为build任务添加了一个依赖项。这是必要的,因为我们只能在编译后运行我们的main类:
~/work/blogdemo/tutorials/gradle-java-exec> ./gradlew runWithExec
> Task :runWithExec
Goodbye cruel world ...
BUILD SUCCESSFUL in 666ms
6 actionable tasks: 6 executed
5.2. 从输出 Jar 运行
第二种方式依赖于我们小应用的jar打包:
task runWithExecJarOnClassPath(type: Exec) {
dependsOn jar
group = "Execution"
description = "Run the mainClass from the output jar in classpath with ExecTask"
commandLine "java", "-classpath", jar.archiveFile.get(), javaMainClass
}
请注意第 2 行对 jar 任务的依赖关系以及第 5 行对 java 可执行文件的第二个参数。我们使用的是普通 jar,因此我们需要使用第四个参数指定入口点:
~/work/blogdemo/tutorials/gradle-java-exec> ./gradlew runWithExecJarOnClassPath
> Task :runWithExecJarOnClassPath
Goodbye cruel world ...
BUILD SUCCESSFUL in 555ms
3 actionable tasks: 3 executed
5.3. 从可执行输出 Jar 运行
第三种方式也依赖于jar打包,但是我们通过manifest属性来定义入口点:
jar {
manifest {
attributes(
"Main-Class": javaMainClass
)
}
}
task runWithExecJarExecutable(type: Exec) {
dependsOn jar
group = "Execution"
description = "Run the output executable jar with ExecTask"
commandLine "java", "-jar", jar.archiveFile.get()
}
在这里,我们不再需要指定类路径,我们可以简单地运行 jar:
~/work/blogdemo/tutorials/gradle-java-exec> ./gradlew runWithExecJarExecutable
> Task :runWithExecJarExecutable
Goodbye cruel world ...
BUILD SUCCESSFUL in 572ms
3 actionable tasks: 3 executed