Gradle Javaアプリケーションのビルド定義¶
はじめに¶
本記事では、Javaアプリケーション(コマンドラインから実行可能なJavaプログラム)をGradleでビルドするための定義、使用について記載します。
Gradleのビルド定義では、DSLにKotlinを使用します。
対象のJDKバージョンは21とし、GradleはJDK 21に対応した8.4を使用します。
Javaアプリケーションは、JPMS(Java Platform Module System)を使用します。
Javaアプリケーションのビルド定義¶
依存関係のないJavaアプリケーション¶
ビルド定義¶
依存関係のない(Java SE標準APIだけを使用する)アプリケーションをビルドする定義です。
- Gradleのapplicationプラグインを使用
- Javaのコンパイルでは、ソースレベル(-source)、ターゲットレベル(-target)をJava SE 21に指定
- JPMSのモジュールパスを使用
- ソースファイルのエンコーディングはUTF-8
- OpenJDK 18以降では、JavaVMのシステムのデフォルトエンコーディングはUTF-8となり、UTF-8で記述したソースファイルをエンコーディングを指定せずにそのままjavacでコンパイルできるようになりました。
- アプリケーションのエントリ・ポイントとなるクラス(メインクラス)を含むモジュール名を指定(com.torutk.hello)
- アプリケーションのエントリ・ポイントとなるクラス(メインクラス)名を指定(com.torutk.hello.HelloApp)
plugins {
application
}
group = "com.torutk"
version = "1.0-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
application {
mainModule.set("com.torutk.hello")
mainClass.set("com.torutk.hello.HelloApp")
}
|
- Kotlinで、pluginsの指定は、リテラル記述(クォートなし)が可能
ビルド結果(JAR)¶
Gradleのapplication のjarタスクを実行すると、build/libsディレクトリ下にアプリケーションのjarファイルが生成されます。
% tree build/libs build/libs └── hello-1.0-SNAPSHOT.jar
プロジェクト名 + ビルド定義のversionに記述した文字列(1.0-SNAPSHOT)に基づきJARファイルが生成されます。
複数モジュール(≠JPMSモジュール)を収容するGradleプロジェクトの場合は、モジュール名 + ビルド定義のversion記述文字列に基づきます。
次のコマンドで実行します。
% java -p build/libs/hello-1.0-SNAPSHOT.jar -m com.torutk.hello Hello, JDK 21 World.
- -p オプションは--module-pathの省略表記で、モジュール(ここではJARファイル)のパスを指定
- -m オプションは--module の省略表記で、実行するエントリポイントとなるモジュール名を指定
- メインクラスは、ビルド定義の中に記述しているので、実行時に指定を省略することが可能
- メインクラスを明示的に指定するには、-mオプションにモジュール名に続いて/で区切りメインクラスのFQCNを指定します。
-m com.torutk.hello/com.torutk.hello.HelloApp
- メインクラスを明示的に指定するには、-mオプションにモジュール名に続いて/で区切りメインクラスのFQCNを指定します。
ビルド結果(ZIP/TAR)¶
- distTar
- distZip
配布用のアーカイブを生成します。アーカイブはZIP形式またはTAR形式が指定可能で、モジュールのJARファイルの他にアプリケーションを実行するスクリプトファイル(Linux/MacOS用)、バッチファイル(Windows用)が含まれます。
% tar tf hello-1.0-SNAPSHOT.tar hello-1.0-SNAPSHOT/ hello-1.0-SNAPSHOT/lib/ hello-1.0-SNAPSHOT/lib/hello-1.0-SNAPSHOT.jar hello-1.0-SNAPSHOT/bin/ hello-1.0-SNAPSHOT/bin/hello.bat hello-1.0-SNAPSHOT/bin/hello
applicationプラグインについて¶
追加の定義¶
アプリケーション起動時のJVMオプション指定¶
application {
applicationDefaultJvmArgs = listOf("-Dcom.torutk.hello.language=en")
}
アプリケーション名(jarファイル名)¶
生成されるjarファイルを、デフォルトの名前(ディレクトリ名にちなむ)から指定した名前とするには、ビルド定義に次のように指定します。
roject.base.archivesBaseName = "helloApp"
アプリケーションのバージョン名¶
生成されるjarファイルに、hello-1.0.1.jar のようにバージョン番号を入れるには、
- gradleのビルド実行時にコマンドラインからプロパティでバージョン指定ができる
hello% ./gradlew jar -Pversion=1.0.1 : hello% ls build/libs hello-1.0.1.jar
- ビルド定義に指定
version = "1.2.1"
アプリケーションの起動スクリプト名¶
gradleのapplicationプラグインでは、ビルド成果物のjarファイルを実行する起動スクリプト(Linux, MacOS用のシェルスクリプトとWindows用のバッチファイル)が生成されます。
起動スクリプトのファイル名は、デフォルトではプロジェクト名(gradleプロジェクトのディレクトリ名)ですが、これを指定した名前にビルド定義で記述することができます。
application {
applicationName = "MyHelloApp"
}
この定義は、生成されるjarファイル名には影響しません。起動スクリプトのスクリプト名に反映されます。
定義前のデフォルトは、プロジェクト名のhelloが起動スクリプト名になります。
hello % ls build/scripts hello hello.bat
定義後は、起動スクリプト名が指定した名称になります。
hello % ls build/scripts MyHelloApp MyHelloApp.bat