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'
}
}
}
'IT TIP' 카테고리의 다른 글
datetime을 사용한 Nunit 매개 변수화 된 테스트 (0) | 2020.12.13 |
---|---|
Chrome 및 Safari 브라우저 (웹킷)를 감지하는 방법 (0) | 2020.12.13 |
파이썬 mock을 사용하여 함수 조롱 (0) | 2020.12.12 |
stdlib.h에 strtoi가없는 이유는 무엇입니까? (0) | 2020.12.12 |
CSS2.1이 새 블록 서식 컨텍스트를 설정하기 위해 "표시"이외의 오버플로 값을 정의하는 이유는 무엇입니까? (0) | 2020.12.12 |