Gradle에서 한 곳에서 공통 종속성을 어떻게 선언합니까?


109

Maven에는 <dependencyManagement>상위 POM 의 섹션에 종속성을 정의 하고 버전이나 범위 등을 지정하지 않고 하위 모듈에서 해당 종속성을 참조 할 수있는 매우 유용한 기능이 있습니다 .

Gradle의 대안은 무엇입니까?

답변:


179

상위 스크립트에서 공통 종속성을 선언 할 수 있습니다.

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 용어의 범위 )입니다. 그러나 내 경험상 어쨌든 이것에 대해 명시하는 것이 좋습니다.


3
고마워, 이것은 내 질문을 해결하지만 여전히 걱정거리가 있습니다. Maven에서는 버전을 비워 둘 수 있으며 이것이 lib 인 경우 앱에서 사용할 수 있고 dependencyManagement를 만들어 lib의 버전을 정의 할 수 있기 때문에 편리합니다. 걸릴 것입니다. Gradle로 어떻게 하시겠습니까?
Stanislav Bashkyrtsev 2013 년

질문을 이해하지 못합니다. 예를 들어주세요.
Peter Niederwieser 2013 년

4
Peter, ctapobep이 말하는 것은 maven에서 dependencyManagement 섹션의 부모 (또는 집계 자) pom에서 버전 (및 범위)으로 종속성을 선언 할 수 있다는 것입니다. 그런 다음 "콘크리트"pom에서 버전을 다시 선언 할 필요가 없습니다. 아티팩트와 groupId 만 있습니다. 기본적으로 maven에게 "X : Y가 필요하지만 부모가 구성한 버전을 사용합니다."라고 말합니다.
Michael Campbell

2
이러한 종류의 중복을 방지하기 위해 dependencies.gradle모든 종속성을 속성으로 정의 하는 별도의 스크립트 를 만드는 경향이 있습니다 ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'. 예 : . 루트 프로젝트 build.gradle에는 allprojects { apply from: "$rootDir/dependencies.gradle" }. 그런 다음 모든 종속성이 분산되지 않고 하나의 파일에 정의되고 종속성 구성에서 "읽기 쉬운"상수가 사용됩니다.
Steinar 2013-10-10

1
그게 제가 위에서 한 일입니다. allprojects프로젝트 수준의 추가 속성이 하위 프로젝트에 표시되므로 적용 할 필요가 없습니다 .
Peter Niederwieser

7

답변이 늦었지만 http://plugins.gradle.org/plugin/io.spring.dependency-management 메이븐 'bom'을 가져와 정의를 재사용 할 수있는 가능성을 제공합니다. 'bom'에 정의되어 있습니다. maven에서 gradle로 점차 마이그레이션 할 때 확실히 좋은 도움이됩니다! 지금 즐기고 있습니다.


여러 (다중) 프로젝트에서 동일한 종속성을 공유하려는 경우에도 필수입니다.
roomsg 2014

7
이 플러그인은 편리하지만 상당한 성능 공간을 가질 수 있습니다. 200 개 이상의 종속성이있는 30 개의 하위 프로젝트의 경우 종속성 해결 단계에 최대 1 분이 추가됩니다. 작은 프로젝트의 경우는하지만, 마법처럼 작동합니다
JK1

또한 전이 종속성 버전을 재정의합니다. 예를 들어 종속성 관리에서 버전 3.0.0을 선언했지만 하위 프로젝트 중 하나의 경우 2.5.0과 같은 이전 버전을 사용해야합니다. 그러면이 이전 프로젝트에 종속 된 프로젝트가있는 경우 전 이적 종속성은 2.5.0에서 종속성 관리 플러그인에 선언 된 내용으로 덮어 쓰여
지므로이

7

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")
}

하위 빌드는 여전히 더 높은 버전을 지정하도록 선택할 수 있습니다. 더 낮은 버전이 지정되면 제약 조건의 버전으로 자동 업그레이드됩니다.


1
종속성 제약 조건이 Gralde 4.6에 추가되었으므로 Gradle 4.6 이상에서 작동합니다.
Jim Hurne

나는 Gradle 이 이러한 경우 Java Platform Plugin을 제공한다고 생각합니다 . 그러나 현재 Gradle 문서는 명확하지 않습니다. 의 사용법 allprojects도 괜찮은 것 같아요 .
JojOatXGME

루트 프로젝트에서 제약 조건을 선언하고 싶지만 내 하위 프로젝트 중 하나에서만 제약 조건이 정의 된 모든 종속성을로드하고 싶습니다.
dtc

2

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-bomorg.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.


1

아래 코드를 사용하여 종속성을 중앙화 할 수 있습니다 .

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}"
}

1

이 블로그 게시물은 종속성 및 그룹을 구성으로 관리하는 것을 제안합니다. 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
}

0

gradle 파일을 깨끗하게 유지하기 위해 종속성을 배열로 그룹화하고 나중에 구현할 수 있습니다.

  1. 종속성 블록 외부의 build.gradle (앱 수준)다음 과 같은 라이브러리 버전을 추가합니다 .

// 라이브러리 버전 선언

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  1. 나중에 쉽게 찾을 수 있도록 관련 종속성의 배열을 만듭니다. 종속성 블록 외부의 build.gradle (앱 수준) 에 추가합니다 .

// 라이브러리에서 버전을 사용하고 액세스 이름과 함께 종속성 추가 (예 : 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}"
]
  1. 그리고 의존성 블록에서 :

// 배열의 모든 종속성 구현

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()
}

이것에 의해 주석 프로세서를 포함하는 방법 ?? 롬복의 경우처럼
Pritish Joshi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.