Gradle「because no repositories are defined」の原因と直し方
because no repositories are defined は、repositories に依存の取得元を書けば直る。
buildscript や pluginManagement に書いた取得元は、プロジェクトの依存には使われない。
公開: 更新:
要約
gradle build がコンパイルの前に止まり、* What went wrong: の下に次の行が出る。
Cannot resolve external dependency com.google.guava:guava:33.4.0-jre because no repositories are defined.その上には Could not resolve all files for configuration ':compileClasspath'. のように、どの設定(configuration)の依存を解決できなかったかを示す行が付く。
because no repositories are defined は、依存を取りに行く先(リポジトリ)が 1 つも設定されていないという意味だ。
Gradle は dependencies に書いた依存を、repositories に書いた取得元からだけ探す。
Maven と違い、何も書かなければ Maven Central にも探しに行かない。
依存のバージョンが間違っているときの Could not find とは別のエラーだ。
Required by: の下には、その依存を宣言したプロジェクトが出る。
マルチプロジェクトでは、どのプロジェクトで取得元が欠けているかをここで見る。
解決策
1. 依存を宣言した build ファイルに書く
build.gradle.kts(Kotlin DSL)の例:
plugins {
java
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.google.guava:guava:33.4.0-jre")
}build.gradle(Groovy DSL)でも同じく、repositories { mavenCentral() } を buildscript { } の外のトップレベルに置く。
2. settings にまとめて書く
マルチプロジェクトで全部のプロジェクトに同じ取得元を使うなら、settings.gradle.kts の dependencyResolutionManagement に書く(Centralizing Repository Declarations(新しいタブで開く))。
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}既定では、プロジェクトの build ファイルに書いた repositories が settings 側の宣言を上書きする。
プロジェクト側に別の取得元を 1 つだけ書くと、そのプロジェクトでは settings の mavenCentral() が使われなくなるので、混ぜないほうがよい。
この優先順位は repositoriesMode で変えられる。
よくある原因
repositoriesを書いていない。
依存だけ書き写し、取得元を忘れている。buildscriptの中にだけ書いている。buildscript { repositories { } }は、ビルドスクリプト自身が使う依存(クラスパス)の取得元だ。
プロジェクトのdependenciesには使われない。pluginManagementの中にだけ書いている。
settings のpluginManagement { repositories { } }は、プラグインを解決するための取得元である(Working with Plugins(新しいタブで開く))。
これもライブラリの依存には使われない。- サブプロジェクトに取得元が無い。
build ファイルのrepositoriesは、そのファイルのプロジェクトだけの設定だ。
ルートに書いても:appなどのサブプロジェクトには効かない。 buildSrcに取得元が無い。buildSrcは、Gradle が別のビルドとして扱うディレクトリで、build ファイルも本体とは別に持つ(Sharing Build Logic using buildSrc(新しいタブで開く))。buildSrcで依存を使うなら、その build ファイルにも取得元を書く。