code

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

codestyles 2020. 8. 19. 08:05
반응형

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.

  1. 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'
  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}"
]
  1. 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()
}

참고URL : https://stackoverflow.com/questions/9547170/in-gradle-how-do-i-declare-common-dependencies-in-a-single-place

반응형