こんにちは、エキサイト株式会社の平石です。
今回は、Gradleでマルチプロジェクトを構成している状態で、MavenのLocalRepositoryを指定する際にハマった内容を紹介します。
デフォルト以外のLocalRepository
今回は、repositoriesの設定で独自のRepositoryを指定することを目的としていました。
Maven Repositoryに上げられているようなグローバルに公開されているライブラリを利用する際には、
repositories { mavenCentral() }
のように記述します。
ローカルにあるRepositoryを設定したい場合には
repositories { mavenLocal() }
のように記述します。
デフォルトでは、LocalRepositoryは$USER/.m2/repositories
にあります。
しかし、時にはプロジェクトごとに分けたいという理由で別のローカルリポジトリを指定したい場合もあります。
今回は、local_repository
というディレクトリをプロジェクトルート直下に作成して、そこにライブラリを入れているとします。
この場合、build.gradle
に以下のように記述することで、指定することができます。
repositories {
maven {
url "./local_repository"
}
}
url
には、サーバー上のリポジトリやS3のようなオブジェクトストレージにあるライブラリへのパスを記述できますが、ローカル環境にあるリポジトリの場所を指定することもできます。
以下のように、プロジェクトに依存関係を追加することができます。
dependencies {
implementation "com.example.rh:sample:0.0.1-SNAPSHOT"
}
このように一つのプロジェクト内のみでの設定であれば問題ないのですが、allprojects
やsubprojects
を利用して複数のプロジェクトに対して設定を行おうとしたときにハマってしまいました。
以下が、ハマったときのプロジェクトルート直下のbuild.gradle
の全体です。
plugins { id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '21' } allprojects { repositories { mavenCentral() maven { url "./local_repository" } } } subprojects { apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-web' } } project(':sub_project') { dependencies { implementation "com.example.rh:sample:0.0.1-SNAPSHOT" } }
allprojects
でmavenCentral
とプロジェクトルート直下の./local_repository
からライブラリを取得することを指定しています。
また、:subproject
というサブプロジェクトに./local_repository
から"com.example.rh:sample:0.0.1-SNAPSHOT"
という依存関係を追加しています。
この状態で、gradleプロジェクトをビルドすると、以下のようなエラーが発生します。
:sub_project:main: Could not find com.example.rh:sample:0.0.1-SNAPSHOT. Required by: project :sub_project
com.example.rh:sample:0.0.1-SNAPSHOT
が見つからないというエラーのようですが、allprojects
ブロックでrepositoriesは指定しているはずです。
これはどういうことでしょうか。
解決法はシンプルで、LocalRepositoryの指定を絶対パスにします。
allprojects { repositories { mavenCentral() maven { url "$rootDir/local_repository" } } }
allprojects
でLocalRepositoryを指定した際に、その指定したプロジェクトから見たパスで全体に対して取り込まれると勘違いしていました。
しかし、実際には各プロジェクトから見たパスで参照しているようです。
したがって、subproject
というサブプロジェクトはdependency_test
の配下にあり、dependency_test/subproject
にはlocal_repository
というrepositoryが存在しないため、依存関係を解決できなかったようです。
仕様を理解していれば当然の結果ではありました。
終わりに
今回は、マルチプロジェクトにおけるLocalRepositoryを指定する際にハマった内容を紹介しました。
では、また次回。