Gradleを使用してJava mainメソッドを実行する

  • link:/category/programming/ [プログラミング]

  • Gradle

1. 前書き

このチュートリアルでは、Gradleを使用してlink:/java-main-method[Java _main_ method]を実行するさまざまな方法を検討します。

2. Java _main_メソッド

GradleでJava _main_メソッドを実行する方法はいくつかあります。 標準出力にメッセージを出力する簡単なプログラムを使用して、それらを詳しく見てみましょう。
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_と呼ばれるタスクを自動的に生成します。 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_クラスを定義し、さらにクラスパスを指定する必要があります。 クラスパスは、ビルド出力のデフォルトプロパティから計算され、コンパイルされたクラスが実際に配置される正しいパスを含みます。
各シナリオでは、_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. 実行可能出力Jarからの実行

3番目の方法も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/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実行可能ファイルとさまざまな組み合わせで使用して、同じ結果を達成できますが、他のタスクへの依存が必要です。
いつものように、このチュートリアルのソースコードはhttps://github.com/eugenp/tutorials/tree/master/gradle-5[GitHub上]で入手できます。