<dependencyManagement>
Mavenには、親POMのセクションで依存関係を定義し、バージョンやスコープなどを指定せずに子モジュールからその依存関係を参照できる非常に便利な機能があります。
Gradleの代替手段は何ですか?
<dependencyManagement>
Mavenには、親POMのセクションで依存関係を定義し、バージョンやスコープなどを指定せずに子モジュールからその依存関係を参照できる非常に便利な機能があります。
Gradleの代替手段は何ですか?
親スクリプトで共通の依存関係を宣言できます。
ext.libraries = [ // Groovy map literal
spring_core: "org.springframework:spring-core:3.1",
junit: "junit:junit:4.10"
]
子スクリプトから、次のように依存関係宣言を使用できます。
dependencies {
compile libraries.spring_core
testCompile libraries.junit
}
依存関係の宣言を高度な構成オプションと共有するには、次を使用できますDependencyHandler.create
。
libraries = [
spring_core: dependencies.create("org.springframework:spring-core:3.1") {
exclude module: "commons-logging"
force = true
}
]
複数の依存関係を同じ名前で共有できます。
libraries = [
spring: [ // Groovy list literal
"org.springframework:spring-core:3.1",
"org.springframework:spring-jdbc:3.1"
]
]
dependencies { compile libraries.spring }
次に、両方の依存関係を一度に追加します。
この方法で共有できない情報の1つは、依存関係を割り当てる必要のある構成(Maven用語ではスコープ)です。しかし、私の経験から、とにかくこれについて明確にする方が良いです。
Gradle 4.6以降、これを実現する方法として、依存関係の制約がドキュメントで提案されています。https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_versionから:
大規模なプロジェクトで推奨される方法は、バージョンなしで依存関係を宣言し、バージョン宣言に依存関係制約を使用することです。利点は、依存関係の制約により、推移的な依存関係を含むすべての依存関係のバージョンを1か所で管理できることです。
親build.gradle
ファイル:
allprojects {
plugins.withType(JavaPlugin).whenPluginAdded {
dependencies {
constraints {
implementation("com.google.guava:guava:27.0.1-jre")
}
}
}
}
Javaプラグイン(... whenPluginAdded {
)のチェックで依存関係ブロックをラップすることは厳密には必要ではありませんが、同じビルドへの非Javaプロジェクトの追加を処理します。
次に、子gradleプロジェクトでは、単純にバージョンを省略できます。
apply plugin: "java"
dependencies {
implementation("com.google.guava:guava")
}
子ビルドでも、より高いバージョンを指定することを選択できます。下位バージョンが指定されている場合は、制約内のバージョンに自動的にアップグレードされます。
返信が遅れていますが、以下もご覧ください。http: //plugins.gradle.org/plugin/io.spring.dependency-management Maven'bom'をインポートし、定義を再利用する可能性を提供します。 'bom'で定義されています。MavenからGradleに徐々に移行する場合は、確かに便利です。今それを楽しんでいます。
io.spring.gradle:dependency-management-plugin
プラグインには新しいGradle3.xシリーズで問題がありますが、2.xシリーズでは安定しています。参考までに、バグレポートを参照してください。Gradle3#115のサポートを削除します。
Spring(BOM使用の主なプロモーター)の場合、次のように終了することがあります。
buildscript {
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE'
}
}
repositories {
mavenLocal()
jcenter()
}
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
dependencyManagement {
imports {
mavenBom 'io.spring.platform:platform-bom:Athens-SR3'
}
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
Spring Bootと互換性があるように、親としてio.spring.platform:platform-bom
持つことに注意してくださいorg.springframework.boot:spring-boot-starter-parent
実際の依存関係の解決は、次の方法で確認できます。
$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ
$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ
またはタスクあり:
task showMeCache {
configurations.compile.each { println it }
}
公式のSoringブログ投稿を読んで、Gradleの依存関係管理を改善し、導入の理由を理解してio.spring.gradle:dependency-management-plugin
ください。
ルートプロジェクトにコンテンツを含むcommon_dependencies.gradleファイルを作成することをお勧めします
buildscript {
ext {
commonDependencies = [
redis : 'redis.clients:jedis:3.6.3',
lettuce : 'io.lettuce:lettuce-core:6.1.4.RELEASE'
]
}
}
次に、ルート/サブモジュールのbuild.gradleで
apply from: rootProject.file("common_dependencies.gradle")
dependencies {
commonDependencies.values().forEach {
implementation it
}
}
以下のコードを使用して、依存関係を一元化できます。
のgradle.properties
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
TARGET_SDK_VERSION=26
MIN_SDK_VERSION=14
ANDROID_SUPPORT_VERSION=26.0.2
各モジュールで次を追加しbuild.gradle
ます:
android {
compileSdkVersion COMPILE_SDK_VERSION as int
buildToolsVersion BUILD_TOOLS_VERSION as String
defaultConfig {
minSdkVersion MIN_SDK_VERSION as int
targetSdkVersion TARGET_SDK_VERSION as int
versionCode 1
versionName "1.0"
}
}
dependencies {
compile "com.android.support:appcompat-v7:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-v4:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-annotations:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-vector-drawable:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:design:${ANDROID_SUPPORT_VERSION}"
}
このブログ投稿では、依存関係とグループを構成として管理することを提案しています: https ://www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html
自分で試したことはありませんが、面白そうです。
ルートプロジェクトbuild.gradle
subprojects {
configurations {
commonsIo
}
dependencies {
commonsIo 'commons-io:commons-io:2.5'
}
}
サブプロジェクトbuild.gradle
configurations {
compile.extendsFrom commonsIo
}
gradle 7.1.1以降、バージョンカタログを使用できます
dattaが回答で述べたように、Gradleにはバージョンカタログと呼ばれるものがあります。
Kotlin DSL(* .kts)の例を次に示します。Gradle7.4を使用していることに注意してください。
settings.gradle.ktsでの依存関係の定義:
// Configure dependencies aspects applied to all projects
dependencyResolutionManagement {
// By default, repositories declared by a project will override the ones here.
// You can change this behavior with the repositoriesMode property.
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
// Define repositories for all projects
repositories {
mavenCentral()
maven("https://jitpack.io")
}
versionCatalogs {
create("libs") {
// Versions are useful specially when you have libraries with the same
// group and version which are updated together with the same version
version("room", "2.4.1")
// │ │
// │ └───> The version notation
// └───> Your desired name (alias)
library("material", "com.google.android.material:material:1.4.0")
// │ │
// │ └───> The dependency notation (coordinates)
// ├───> Your desired name (alias); only letters, digits and _ - .
// └───> Note that _ - . will all be normalized to .
// You can configure the version as you would in regular build file
// Note that the group and module are separate parameters
library("junit5", "org.junit.jupiter", "junit-jupiter").version {
prefer("5.8.0")
}
// Using the same version for multiple dependencies
library("room-ktx", "androidx.room", "room-ktx").versionRef("room")
library("room-runtime", "androidx.room", "room-runtime").versionRef("room")
}
}
}
build.gradle.ktsでの使用法:
dependencies {
implementation(libs.material)
implementation(libs.room.ktx)
implementation(libs.room.runtime)
testImplementation(libs.junit5)
}
ご覧のとおり、依存関係を宣言できるだけでなく、ここでリポジトリを宣言することもできます(allprojects
最上位のビルドスクリプトでブロックを使用してすべてのサブプロジェクトのリポジトリを定義する代わりに)。
上記のソリューションのGroovy構文、およびバージョンカタログとリポジトリと依存関係の構成の集中化の詳細については、Gradleの公式ガイドを参照してください。
Gradleファイルをクリーンに保つために、依存関係を配列にグループ化し、後で実装することができます。
//ライブラリのバージョンを宣言します
final RetrofitVersion = '2.3.0' final OkHttpVersion = '3.9.1'
//ライブラリでバージョンを使用し、アクセス名とともに依存関係を追加します(retrofit(first one)など)
final networkDependencies = [ retrofit : "com.squareup.retrofit2:retrofit:${RetrofitVersion}", retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}", retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}", okHttp3 : "com.squareup.okhttp3:okhttp:${OkHttpVersion}", okHttp3Logging : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}" ]
//配列からすべての依存関係を実装します
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation networkDependencies.values() }
したがって、最終的なコードは次のようになります。
final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
final networkDependencies = [
retrofit : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
okHttp3 : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
okHttp3Logging : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation networkDependencies.values()
}