1. 序章

このチュートリアルでは、Gradleを使用してJavaメインメソッドを実行するさまざまなメソッドについて説明します。

2. Java mainメソッド

GradleでJavamainメソッドを実行する方法はいくつかあります。 標準出力にメッセージを出力する簡単なプログラムを使用して、それらを詳しく見てみましょう。

public class MainClass {
    public static void main(String[] args) {
        System.out.println("Goodbye cruel world ...");
    }
}

3. アプリケーションプラグインで実行する

アプリケーションプラグインは、アプリケーションのパッケージ化と配布に役立つ、すぐに使用できるタスクのコレクションを定義するコアGradleプラグインです。

build.gradleファイルに以下を挿入することから始めましょう。

plugins {
    id "application"
}
apply plugin : "java" 
ext {
   javaMainClass = "com.baeldung.gradle.exec.MainClass"
}

application {
    mainClassName = javaMainClass
}

プラグインは、 run というタスクを自動的に生成します。このタスクでは、mainクラスを指すだけで済みます。 9行目のクロージャーはまさにそれを実行し、タスクをトリガーできるようにします。

~/work/baeldung/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クラスを定義し、さらにクラスパスを指定する必要があります。 クラスパスは、ビルド出力のデフォルトプロパティから計算され、コンパイルされたクラスが実際に配置される正しいパスが含まれています。

各シナリオで、メインクラスの完全修飾名(パッケージを含む)を使用していることに注意してください。

JavaExecを使用して例を実行してみましょう。

~/work/baeldung/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 タスクタイプを使用して、mainクラスを実行できます。 このオプションでは、複数の方法で実行を構成できる可能性があるため、3つのカスタムタスクを実装して、それらについて個別に説明します。

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/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExec

> Task :runWithExec
Goodbye cruel world ...

BUILD SUCCESSFUL in 666ms
6 actionable tasks: 6 executed

5.2. 出力ジャーから実行

2番目のアプローチは、小さなアプリケーションの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実行可能ファイルへの2番目の引数に注意してください。 通常のjarを使用するため、4番目のパラメーターでエントリポイントを指定する必要があります:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExecJarOnClassPath

> Task :runWithExecJarOnClassPath
Goodbye cruel world ...

BUILD SUCCESSFUL in 555ms
3 actionable tasks: 3 executed

5.3. 実行可能出力ジャーからの実行

3番目の方法もjarパッケージに依存していますが、マニフェストプロパティを使用してエントリポイントを定義します。

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/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExecJarExecutable

> Task :runWithExecJarExecutable
Goodbye cruel world ...

BUILD SUCCESSFUL in 572ms
3 actionable tasks: 3 executed

6. 結論

この記事では、Gradleを使用してJava mainメソッドを実行するさまざまな方法について説明しました。

すぐに使用できるアプリケーションプラグインは、メソッドを実行するための最小限の構成可能なタスクを提供します。 JavaExec タスクタイプを使用すると、プラグインを指定せずにmainメソッドを実行できます。

最後に、汎用 Exec タスクタイプをJava実行可能ファイルとさまざまな組み合わせで使用して、同じ結果を得ることができますが、他のタスクへの依存が必要です。

いつものように、このチュートリアルのソースコードはGitHubから入手できます。