GradleでローカルのMavenアーティファクトを参照する
ソースは公開されているものの、アーティファクトが公開リポジトリに登録されていないMavenアーティファクトをGradleで依存関係に設定する方法を検討する。
-
例)AzureのNotificationHub: Azure/azure-notificationhubs-java-backend
- groupId -
com.windowsazure
- artifactId -
NotificationHubs
- version -
0.0.4
- groupId -
-
利用すべき方法
- 外部依存のないプレーンなjar -> 方法1
- 外部依存なしのMaven jar -> 方法2/3
- 外部依存ありのMaven jar -> 方法3
方法1 - files
- プロジェクト構成
- gradle-project
- build.gradle
- lib
- NotificationHubs-0.0.4.jar
build.gradle
dependencies {
compile files ('lib/NotificationHubs-0.0.4.jar') // ファイルパスで指定する
}
問題点
- 外部のモジュール参照を行っていないjarファイルに限定される。
- jarファイルがMavenアーティファクトの場合、
files
で指定したモジュールが利用している依存関係が解決されない。実行時にランタイムエラーとなる。- jarのソースファイルが参照できる場合は、対象のMavenアーティファクトを
assemby
かshade
Mavenプラグインでfat jarにすればいい。
- jarのソースファイルが参照できる場合は、対象のMavenアーティファクトを
- jarファイルがMavenアーティファクトの場合、
方法2 - repositories flatDir
- プロジェクト構成
- 方法1と変わらず
build.gradle
repositories {
flatDir {
dirs "lib" // このファオルダに置いたjarを通常のdependencies表記で参照できる
}
}
dependencies {
compile('com.windowsazure:NotificationHubs:0.0.4') // groupId/artifactId/version
}
-
NotificationHubs
が持つ外部依存が解決されていない。コンパイルはできても実行時にクラスが見つからなくてエラーになる。
問題点
- 方法1と同様に、参照したモジュールが更に外部依存を持っている場合、依存関係が解決されない。
- マルチプロジェクトでの利用は注意
- 参照されるサブプロジェクトで自身の
lib
を指定したflatDir
を定義すると、参照を行ったサブプロジェクトは自身のlib
を参照してしまい依存関係の解決に失敗する - ルートプロジェクトに
lib
を配置し、サブプロジェクトではルートプロジェクトのlib
を必ず参照するようにする。
- 参照されるサブプロジェクトで自身の
build.gradle
subprojects {
repositories {
flatDir {
dirs "${rootProject.projectDir}/lib"
}
}
}
方法3 repositories maven (Maven ローカルフォルダ構成)
- プロジェクト構成
- Mavenのローカルリポジトリのフォルダ構成を利用する
- gradle-project
- build.gradle
- lib
- com
- windowsazure
- NotificationHubs
- 0.0.4
- NotificationHubs-0.0.4.jar
- NotificationHubs-0.0.4.pom
build.gradle
repositories {
maven {
url "lib"
}
}
dependencies {
compile('com.windowsazure:NotificationHubs:0.0.4') // groupId/artifactId/version
}
-
NotificationHubs
が持つ外部依存が解決されている。
問題点
- マルチプロジェクト構成においては、方法2と同様の問題があるので注意。