Gradle で Jar ファイル名を指定する

blog1.mammb.com


TL;DR

gradle init タスクで作成したプロジェクトは、モジュールのプロジェクト名が lib や app となる。

Jar ファイル名は プロジェクト名を元に設定されるため、デフォルトでは lib.jarapp.jar のようなJarファイルが生成される。

これを変更するには、base.archivesName プロパティを設定するか、プロジェクト名自体をリネームするのが良い。


プロジェクト作成

バージョン確認

$ gradle -v

------------------------------------------------------------
Gradle 8.1.1
------------------------------------------------------------

Build time:   2023-04-21 12:31:26 UTC
Revision:     1cf537a851c635c364a4214885f8b9798051175b

Kotlin:       1.8.10
Groovy:       3.0.15
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          17.0.7 (Homebrew 17.0.7+0)
OS:           Mac OS X 13.3.1 x86_64

プロジェクトを生成

$ mkdir example && cd example

$ gradle init
Starting a Gradle Daemon (subsequent builds will be faster)

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 3

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 2

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 4

Project name (default: example):
Source package (default: example):
Enter target version of Java (min. 7) (default: 17): 20
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]


> Task :init
Get more help with your project: https://docs.gradle.org/8.1.1/samples/sample_building_java_libraries.html

BUILD SUCCESSFUL in 37s
2 actionable tasks: 2 executed

ビルド

$ ./gradlew build

以下のようなJarが生成される。

$ ls lib/build/libs/
lib.jar

$ jar tf lib/build/libs/lib.jar
META-INF/
META-INF/MANIFEST.MF
example/
example/Library.class


コマンドライン引数でバージョン指定

コマンドラインからプロパティとしてバージョンを指定することで、Jarのバージョン名を指定できる。

$ ./gradlew clean build -Pversion=0.1.0

以下のようなJarが生成される。

$ ls lib/build/libs/
lib-0.1.0.jar


バージョンプロパティを指定する

コマンドラインではなく、lib/build.gradle.kts から指定することもできる。

version = "0.1.0"

以下のようなJarが生成される。

$ ./gradlew clean build

$ ls lib/build/libs/
lib-0.1.0.jar

コマンドラインから -Pversion で指定したものより lib/build.gradle.kts に定義したものが優先となる。


Jar アーカイブ名を直接指定する

Jar タスクの archiveBaseName プロパティで個別指定できる。

version = "0.1.0"
tasks.withType<Jar>().configureEach {
    archiveBaseName.set("foo")
}

以下のようなJarが生成される。

$ ls lib/build/libs/
foo-0.1.0.jar

以下のように、より細かく指定することもできる。

tasks.withType<Jar>().configureEach {
    archiveBaseName.set("foo")
    archiveAppendix.set("bar")
    archiveVersion.set("v1")
    archiveClassifier.set("plain")
    archiveExtension.set("jar")
}

以下のようなJarが生成される。

$ ls lib/build/libs/
foo-bar-v1-plain.jar

Jar タスクのプロパティで名前を指定した場合、以下のように ソースJar や JavadocJar を生成しても、これらの名前には反映されない。 通常は以降に示す方法を使う。

java {
    withSourcesJar()
    withJavadocJar()
}


プロジェクト自体を変更する

Java プラグインでは、Jarアーカイブ名のデフォルト値として project.name が設定される。

ディレクトリ名を変更(Windows の場合は rename lib lib2 など)。

$ mv lib lib2

settings.gradle.kts にも反映。

rootProject.name = "example"
include("lib2")

以下のようなJarが生成される。

$ ./gradlew clean build

$ ls lib2/build/libs/
lib2-0.1.0.jar

プロジェクト名を変えるのが公式の推奨だが、単一モジュールの場合は同じディレクトリ名のネストとなり、ちょっとヤダ。


Base Plugin の archivesName を指定する

プロジェクトのディレクトリ名を変えたくない場合は、Base Plugin の archivesName で指定できる。 この値はデフォルトで project.name の値となっている。 Jar タスクなどの親である AbstractArchiveTask.getArchiveBaseName() で使われるため、ソースJar や JavadocJar などの名前にも反映される。

settings.gradle.kts で定義した名前を使う場合は以下のようにできる。

version = "0.1.0"
base.archivesName.set(rootProject.name)
java {
    withSourcesJar()
    withJavadocJar()
}

以下のようなJarが生成される。

$ ls lib/build/libs/
example-0.1.0.jar
example-0.1.0-javadoc.jar
example-0.1.0-sources.jar