Contents

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