概要: Gradleを使用したJavaプロジェクトにおいて、JARファイルの作成方法からMaven Centralへの公開手順までを解説します。リポジトリ管理の基本やmavenLocalの注意点、Fat JAR作成時のポイントも紹介します。
Gradleのリポジトリ管理:mavenCentralとmavenLocalの正しい使い分け
リポジトリ宣言の基本と順序の重要性
Gradleでは依存関係を取得する場所をrepositoriesブロックで宣言します。Maven CentralはmavenCentral()、ローカルMavenリポジトリはmavenLocal()と記述します。複数のリポジトリを宣言した場合、宣言した順番に依存関係が検索されるため、通常はMaven Centralを先に宣言するのが安全です。
GradleはMaven POMに記載された追加リポジトリを無視し、ビルドスクリプトで明示的に宣言されたリポジトリのみを使用します。これにより、意図しない場所からライブラリが取得されるリスクを防げます。(出典:Gradle「Declaring Repositories」)
mavenLocalを使う際の注意点
Gradle公式はmavenLocal()を依存関係の取得元として使うことを非推奨としています。理由は、Mavenがローカルリポジトリを「リポジトリ」ではなく「キャッシュ」として扱うため、不完全なモジュールが含まれる可能性があるからです。
また、成果物の出所が追跡できず、セキュリティや再現性のリスクがあります。ビルド速度も低下するため、使用する場合はcontent { includeGroup("...") }で対象グループを限定することが推奨されます。(出典:Gradle「Supported Repository Types」)
リポジトリの内容フィルタリング
Gradleではリポジトリごとに取得できるグループやリリース種別を制限できます。これにより、依存関係の汚染防止とビルド速度の向上が期待できます。
content { includeGroup("com.example") }:特定グループのみ許可mavenContent { releasesOnly() }:リリース版のみ取得exclusiveContent { ... }:特定の成果物を特定リポジトリに限定
社内リポジトリとMaven Centralを併用する場合、社内ライブラリを社内リポジトリに限定することで、意図しない同名ライブラリの混入を防げます。(出典:Gradle「Declaring Repositories」)
mavenCentralは公開リポジトリ、mavenLocalはローカルキャッシュ。依存取得にはmavenCentralを優先し、mavenLocalは検証用途に限定するのが安全です。
JavaプロジェクトでJARを作成する:jarタスクと実行可能JARの設定方法
jarタスクの基本動作
Java Plugin(javaまたはjava-library)を適用すると、jarタスクが自動的に利用可能になります。このタスクはsrc/main/javaのコンパイル済みクラスとsrc/main/resourcesのリソースをパッケージングします。
出力先はデフォルトでbuild/libs/プロジェクト名-バージョン.jarです。特別な設定をしなくても、./gradlew jarを実行するだけでJARファイルが生成されます。(出典:Gradle「Java Plugin」)
実行可能JARの作成方法
実行可能JARを作るには、JARのマニフェストにMain-Class属性を設定します。これによりjava -jar app.jarで直接起動できるようになります。以下はGroovy DSLでの設定例です。
jar {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
}
Kotlin DSLではtasks.jar { manifest { attributes["Main-Class"] = "com.example.Main" } }と記述します。Main-Classにはパッケージ名を含む完全修飾名を指定します。(出典:Gradle「Java Plugin」)
ビルドタスクとの関係
jarタスクはbuildタスクの依存タスクとして実行されます。./gradlew buildを実行すると、コンパイル、テスト、JAR作成が順に実行されます。
JARを個別に作成したい場合は./gradlew jarを実行します。テストを実行せずに素早くJARだけを作成したい場合に便利です。
jarタスクはJava Plugin適用で自動利用可能。実行可能JARにするにはマニフェストへのMain-Class設定が必須です。
Fat JARの作成方法と注意点:依存関係を含む単一JARの作り方
Fat JARとは何か
Fat JAR(Uber JAR)とは、依存ライブラリをすべて含んだ単一の実行可能JARのことです。外部ライブラリを個別に配布する必要がなく、java -jar app.jarだけで動作するため、配布が容易になります。
ただし、GradleにはFat JARを作成する標準タスクはなく、jarタスクを拡張して手動でカスタムタスクを定義する必要があります。
Fat JARの作成方法
依存関係のJARを展開して、自プロジェクトのクラスと結合します。基本的なアプローチは以下の通りです。
tasks.register('fatJar', Jar) {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from sourceSets.main.output
dependsOn configurations.runtimeClasspath
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
}
Gradle 7以降ではduplicatesStrategyの設定が必須です。複数のライブラリに同じパスのファイルが含まれる場合の競合を防ぎます。
Fat JAR利用時の注意点
Fat JARには以下のような注意点があります。
- ライセンス確認:組み込むライブラリのライセンスが再配布を許可しているか確認が必要
- 署名付きJARの破損:署名付きJARを展開すると署名が無効になる場合がある
- ファイルサイズ増大:すべての依存関係を含むためサイズが大きくなる
- バージョン競合:複数のライブラリが同じリソースを含む場合の競合が発生し得る
Gradle 7以降ではcompileコンフィギュレーションが削除されたため、古い記事にあるconfigurations.compileは使用できません。runtimeClasspathを使用します。
Fat JARは配布が容易になる一方、手動タスク定義とライセンス・競合への注意が必要です。用途に応じてapplicationプラグインの配布形式も検討しましょう。
maven-publishプラグインによるMaven CentralとMaven Localへの公開手順
maven-publishプラグインの基本設定
maven-publishプラグインは、Maven互換リポジトリへの成果物公開機能を提供するGradle標準プラグインです。java-libraryプラグインと併用し、from components.javaで公開対象を指定します。
plugins {
id 'java-library'
id 'maven-publish'
}
group = 'com.example'
version = '1.0.0'
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
repositories {
maven {
name = 'remote'
url = uri('https://repo.example.com/maven2')
}
}
}
生成されるPOMのgroupId、artifactId、versionは、それぞれproject.group、project.name、project.versionから自動的に設定されます。(出典:Gradle「Maven Publish Plugin」)
Maven Localへの公開手順
publishToMavenLocalタスクを実行すると、ローカルMavenリポジトリ(~/.m2/repository)に公開されます。このタスクはpublishing.repositoriesにmavenLocal()を宣言していなくても自動的に生成されます。
./gradlew publishToMavenLocal
公開後は、他のローカルプロジェクトからrepositories { mavenLocal() }を宣言して依存関係として利用できます。なお、publishタスクはリモートリポジトリへの公開のみを行い、Maven Localへは公開しないため注意が必要です。(出典:Gradle「Maven Publish Plugin」)
Maven Central公開に必要な追加設定
Maven Centralへの公開には、POMの完全なメタデータ(ライセンス、開発者、SCM情報)とPGP署名が不可欠です。sources JARとJavadoc JARも多くの場合必須となります。
java {
withSourcesJar()
withJavadocJar()
}
PGP署名にはsigningプラグインを使用し、signing { sign(publishing.publications["mavenJava"]) }のように公開物を署名対象に指定します。リポジトリURLは、バージョン末尾がSNAPSHOTかどうかで切り替える手法が公式サンプルとして紹介されています。(出典:Gradle「Maven Publish Plugin」)
maven-publishプラグインでpublishToMavenLocalタスクとpublishタスクが自動生成されます。Maven Central公開には署名とsources/Javadoc JARが必須です。
Gradleのプロキシ設定:mavenリポジトリへの接続を最適化する方法
Gradleのプロキシ設定の基本
企業ネットワークなどでプロキシサーバーを経由する必要がある場合、Gradleのプロキシ設定はgradle.propertiesファイルに記述します。システムのJVM引数として指定する方法もありますが、プロジェクト固有の設定としてgradle.propertiesに記述するのが一般的です。
プロキシ設定はビルドスクリプトではなく、Gradle実行環境の設定として扱われます。HTTPとHTTPSで別々に設定でき、認証が必要なプロキシの場合はユーザー名とパスワードも指定できます。
HTTPとHTTPSのプロキシ設定
Maven CentralなどのHTTPSリポジトリへの接続にはsystemProp.https.proxyHostとsystemProp.https.proxyPortを設定します。HTTP接続の場合は対応するhttpプレフィックスのプロパティを使用します。
systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
認証が必要なプロキシの場合、systemProp.https.proxyUserとsystemProp.https.proxyPasswordを追加します。
プロキシ除外設定と運用のポイント
社内リポジトリなど、プロキシを経由せずに直接接続したいホストがある場合は、nonProxyHostsで除外設定を行います。パイプ(|)区切りで複数のホストを指定できます。
systemProp.http.nonProxyHosts=localhost|*.internal.example.com
プロキシ設定の変更後はGradleデーモンを再起動する必要があります。./gradlew --stopでデーモンを停止してから次回のビルドを実行すると、新しい設定が反映されます。プロキシ環境では、依存関係のダウンロードが遅い場合にプロキシ設定の見直しが有効な対処となります。
プロキシ設定はgradle.propertiesにsystemPropとして記述します。HTTPS接続用の設定と社内ホストの除外設定を適切に行うことで、依存関係の取得を安定させられます。
まとめ
よくある質問
Q: Gradleで実行可能なJARファイルを作成するにはどうすればいいですか?
A: jarタスクのmanifestブロックでMain-Class属性を設定します。例えば、build.gradleのjarタスク内で「attributes ‘Main-Class’: ‘com.example.Main’」と記述します。
Q: mavenLocal()をリポジトリとして使う際の注意点はありますか?
A: Gradle公式はmavenLocal()の使用を避けることを推奨しています。Mavenのキャッシュとして扱われるため不完全なモジュールが含まれる可能性があり、成果物の出所が追跡できないためです。使用する場合はcontentフィルタで対象グループを絞りましょう。
Q: Fat JARを作成する際の注意点は何ですか?
A: 依存関係をすべて含むFat JARを作成するには、configurations.runtimeClasspathからzipTreeで依存を収集する方法がありますが、Gradle 7以降ではduplicatesStrategyの設定が必要です。また、古いcompile configurationは使用できないため注意してください。
Q: publishタスクとpublishToMavenLocalタスクの違いは何ですか?
A: publishタスクは設定したリポジトリ(例:Maven Central)への公開を行います。一方、publishToMavenLocalはローカルMavenリポジトリ(~/.m2/repository)へのコピーを行います。両者は別のタスクであり、publishが自動的にpublishToMavenLocalを実行することはありません。
Q: GradleでMaven Centralに公開するために必要なものは何ですか?
A: Maven Centralへの公開には、maven-publishプラグインの設定に加えて、PGP署名(signingプラグイン)、sources JAR、Javadoc JAR、POMのメタデータ(ライセンス、開発者、SCM情報など)が必要です。具体的な要件はMaven Centralの公式ドキュメントで確認してください。
