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 용어의 범위 )입니다. 그러나 내 경험상 어쨌든 이것에 대해 명시하는 것이 좋습니다.
답변이 늦었지만 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")
}
Child builds can still choose to specify a higher version. If a lower version is specified it is automatically upgraded to the version in the constraint.
io.spring.gradle:dependency-management-plugin
plugin has problems with new Gradle 3.x series but stable for 2.x series. For reference look to bug report Drop support for Gradle 3 #115
In case of Spring (main promoter of BOM usage) you may end with:
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'
}
Note that io.spring.platform:platform-bom
have org.springframework.boot:spring-boot-starter-parent
as parent so it is compatable with Spring Boot
You can verify actual dependency resolution via:
$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ
$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ
or with task:
task showMeCache {
configurations.compile.each { println it }
}
Read official Soring blog post Better dependency management for Gradle to understand the reason of introducing io.spring.gradle:dependency-management-plugin
.
This blog post suggest managing dependencies and groups as configurations: https://www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html
I have not tried it myself, but it looks interesting.
Root project build.gradle
subprojects {
configurations {
commonsIo
}
dependencies {
commonsIo 'commons-io:commons-io:2.5'
}
}
Sub-project build.gradle
configurations {
compile.extendsFrom commonsIo
}
You can centralize a dependency using below code :
In 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
In each module add to 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}"
}
To keep you gradle file clean, we can group dependency in an array and implement them later.
- Add version of libraries like this in build.gradle (app level) outside of dependency block:
// declare versions of library
final RetrofitVersion = '2.3.0' final OkHttpVersion = '3.9.1'
- Create an array of related dependency, so you can easily find it later. Add it in build.gradle (app level) outside of dependency block:
// Using version in library and add dependency along with access name(like 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}" ]
- And in dependency block:
// Implement all the dependency from array
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation networkDependencies.values() }
So the final code will look like this:
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()
}
'code' 카테고리의 다른 글
쉘 스크립트 대신 make를 사용하는 이유는 무엇입니까? (0) | 2020.08.19 |
---|---|
어댑터 데이터 변경시 목록보기 업데이트 (0) | 2020.08.19 |
데이터 프레임의 행을 벡터로 변환 (0) | 2020.08.19 |
ggplot에서 범례 제목 제거 (0) | 2020.08.19 |
CSS calc ()에서 vh 마이너스 픽셀을 사용할 수 있습니까? (0) | 2020.08.19 |