プロジェクト

全般

プロフィール

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

ビルド結果(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プラグインについて

公式ドキュメント 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


8ヶ月前に更新