IT TIP

Gradle이 두 개의 종속성에 대해 동일한 버전을 설정하도록 강제 할 수 있습니까?

itqueen 2020. 12. 13. 11:32
반응형

Gradle이 두 개의 종속성에 대해 동일한 버전을 설정하도록 강제 할 수 있습니까?


다음 두 가지 종속성을 사용합니다.

compile 'com.google.guava:guava:14.0.1'
compile 'com.google.guava:guava-gwt:14.0.1'

올바르게 작동하려면 둘 다 동일한 버전이어야합니다. 다른 종속성은 더 높은 버전을 사용하기 때문에 Gradle은 각 종속성에 대해 다른 버전을 사용합니다.

다음을 실행하여 이것을 찾았습니다 gradle dependencies.

compile - Compile classpath for source set 'main'.
+--- com.google.guava:guava:14.0.1 -> 17.0
+--- com.google.guava:guava-gwt:14.0.1
|    +--- com.google.code.findbugs:jsr305:1.3.9
|    \--- com.google.guava:guava:14.0.1 -> 17.0 

Gradle이이 두 종속성에 대해 동일한 버전을 설정하도록 강제 할 수 있습니까?


종속성 중 하나는 구아바 버전을 강제로 업데이트하는 것입니다. gradle dependencies버전을 제거하는 라이브러리를 찾는 데 사용 합니다.

문제는 14.0.1을 사용하도록 강제하면 다른 라이브러리가 제대로 작동하지 않을 수 있다는 것입니다. 17.0 버전을 종속성으로 사용할 수 없습니까?

build.gradle에서 개별 버전 번호를 유지하는 대신 버전 번호 매핑이있는 dependency.gradle 파일을 사용하여 build.gradle로 가져옵니다. 이렇게하면 단일 구아바 버전 만 유지하면됩니다. 따라서 귀하의 예는 다음과 같습니다.

dependency.gradle

ext {
    ver = [
        guava: '14.0.1'
    ]
}

그런 다음 build.gradle 파일에서 다음을 가질 수 있습니다.

apply from: "dependencies.gradle"

dependencies {
    compile group: 'com.google.guava', module: 'guava', version: ver.guava
    compile group: 'com.google.guava', module: 'guava-gwt', version: ver.guava
}

그런 다음 17.0으로 이동하려는 경우 종속성 만 변경하면됩니다.

나는 또한 전이 종속성을 false로 설정하는 확실한 팬입니다.

configurations.compile { transitive = false }

이렇게하면 제거 라이브러리가 이전 버전과 완전히 호환되지 않는 경우 런타임에 문제가 발생할 수 있지만 컴파일 타임에 일부 종속성이 제거되지 않습니다. 코드를 작성하는 경우 어떤 라이브러리를 사용하는지 알아야하며 종속성에 대해 명시해야합니다. 의존성 중 하나가 업그레이드하고 엉망으로 만들지 않도록 보호합니다.


이 섹션을 dependency.gradle 파일에 추가하십시오.

configurations.all {
        resolutionStrategy { 
            force 'com.google.guava:guava:14.0.1'
            force 'com.google.guava:guava-gwt:14.0.1'
        }
    }

configurations.all {
  resolutionStrategy {  
    eachDependency { DependencyResolveDetails details ->
      if (details.requested.group == 'com.google.guava') {
        details.useVersion "14.0.1"
      }
    }
  }
}

dependencies {
  compile 'com.google.guava:guava'
  compile 'com.google.guava:guava-gwt'
}

종속성 중 하나가 손상된 spring-web 4.2.4를 사용하는 비슷한 상황이 발생했습니다. 원하는 특정 라이브러리 버전을 강제해야합니다. 다른 의견에서 언급했듯이 호환성 문제가 발생할 수 있지만 때로는 필요합니다.

내가 찾은 라이브러리 버전을 강제하는 최소한의 방해 방법은

compile "org.springframework:spring-web:4.2.3.RELEASE"

강제로 종속성 구성 지정 :

compile("org.springframework:spring-web:4.2.3.RELEASE"){
    force = true
}

I used it when I needed to downgrade Spring version temporarily (until next release).


Alternatively you can use dependencySets (or mavenBom when BOM POM is available) support in spring-dependency-management Gradle plugin. Note that this plugin is also automatically applied with spring-boot Gradle plugin. For more details see here.

plugins {
  id 'io.spring.dependency-management' version '1.0.1.RELEASE'
}

dependencyManagement {
  dependencies {
    dependencySet(group: 'com.google.guava', version: '14.0.1') {
      entry 'guava'
      entry 'guava-gwt'
    }
  }
}

dependencies {
  compile 'com.google.guava:guava'
  compile 'com.google.guava:guava-gwt'
}

If it's OK to just use the newer version for both dependencies, the simplest way to fix your problem is to update your dependencies:

compile 'com.google.guava:guava:17.0'
compile 'com.google.guava:guava-gwt:17.0'

That will make sure both of them are on 17.0. It's simpler than trying to force both of them on the older version and as an added bonus you get a newer version, which (probably) comes with bug fixes and new features.

To be fair @Klunk mentions this in his answer, by asking "Can you not just use the 17.0 version as your dependency?", but it's just in passing and easy to miss, so I thought it made sense to post as a separate answer.


I would suggest against setting transitive = false, as you from this moment you would have to resolve the depency tree yourself manually.

You could either force the desired guava version via configurations.all, or add the depency explicitely and set it forced = true.

Examples here: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/


Another option is to use dependency constraint: https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:dependency_constraints

dependencies {
    implementation 'org.apache.httpcomponents:httpclient'
    constraints {
        implementation('org.apache.httpcomponents:httpclient:4.5.3') {
            because 'previous versions have a bug impacting this application'
        }
        implementation('commons-codec:commons-codec:1.11') {
            because 'version 1.9 pulled from httpclient has bugs affecting this application'
        }
    }
}

참고URL : https://stackoverflow.com/questions/28444016/how-can-i-force-gradle-to-set-the-same-version-for-two-dependencies

반응형