Maven에는 <dependencyManagement>
상위 POM 의 섹션에 종속성을 정의 하고 버전이나 범위 등을 지정하지 않고 하위 모듈에서 해당 종속성을 참조 할 수있는 매우 유용한 기능이 있습니다 .
Gradle의 대안은 무엇입니까?
Maven에는 <dependencyManagement>
상위 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 }
그런 다음 두 종속성을 한 번에 추가합니다.
이러한 방식으로 공유 할 수없는 정보 중 하나 는 종속성을 할당해야하는 구성 ( Maven 용어의 범위 )입니다. 그러나 내 경험상 어쨌든 이것에 대해 명시하는 것이 좋습니다.
dependencies.gradle
모든 종속성을 속성으로 정의 하는 별도의 스크립트 를 만드는 경향이 있습니다 ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'
. 예 : . 루트 프로젝트 build.gradle
에는 allprojects { apply from: "$rootDir/dependencies.gradle" }
. 그런 다음 모든 종속성이 분산되지 않고 하나의 파일에 정의되고 종속성 구성에서 "읽기 쉬운"상수가 사용됩니다.
allprojects
프로젝트 수준의 추가 속성이 하위 프로젝트에 표시되므로 적용 할 필요가 없습니다 .
답변이 늦었지만 http://plugins.gradle.org/plugin/io.spring.dependency-management 메이븐 'bom'을 가져와 정의를 재사용 할 수있는 가능성을 제공합니다. 'bom'에 정의되어 있습니다. maven에서 gradle로 점차 마이그레이션 할 때 확실히 좋은 도움이됩니다! 지금 즐기고 있습니다.
Gradle 4.6부터는이를 달성하기위한 방법으로 문서에 종속성 제약 조건이 제안되어 있습니다. 에서 https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version :
대규모 프로젝트에 권장되는 방법은 버전없이 종속성을 선언하고 버전 선언에 종속성 제약 조건을 사용하는 것입니다. 장점은 종속성 제약 조건을 통해 전 이적 종속성을 포함하여 모든 종속성의 버전을 한 곳에서 관리 할 수 있다는 것입니다.
상위 build.gradle
파일에서 :
allprojects {
plugins.withType(JavaPlugin).whenPluginAdded {
dependencies {
constraints {
implementation("com.google.guava:guava:27.0.1-jre")
}
}
}
}
종속성 블록을 Java 플러그인 (... whenPluginAdded {
) 확인으로 래핑하는 것은 꼭 필요한 것은 아니지만 동일한 빌드에 비 Java 프로젝트 추가를 처리합니다.
그런 다음 자식 gradle 프로젝트에서 verison을 생략 할 수 있습니다.
apply plugin: "java"
dependencies {
implementation("com.google.guava:guava")
}
하위 빌드는 여전히 더 높은 버전을 지정하도록 선택할 수 있습니다. 더 낮은 버전이 지정되면 제약 조건의 버전으로 자동 업그레이드됩니다.
allprojects
도 괜찮은 것 같아요 .
io.spring.gradle:dependency-management-plugin
플러그인은 새로운 Gradle 3.x 시리즈에 문제가 있지만 2.x 시리즈에는 안정적입니다. 참고 로 Gradle 3 # 115에 대한 버그 보고서 Drop 지원을 참조하세요.
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'
}
참고 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
.
아래 코드를 사용하여 종속성을 중앙화 할 수 있습니다 .
에 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 파일을 깨끗하게 유지하기 위해 종속성을 배열로 그룹화하고 나중에 구현할 수 있습니다.
// 라이브러리 버전 선언
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()
}