programing

Gradle에게 두 개의 종속성에 대해 동일한 버전을 설정하도록 강제하려면 어떻게 해야 합니까?

goodjava 2022. 11. 10. 20:51

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에게 이 두 개의 종속성에 대해 동일한 버전을 설정하도록 강제하려면 어떻게 해야 합니까?

dependencies.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 { 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'
}

저도 비슷한 상황이었는데, 어느 한쪽이 스프링 웹 4.2.4를 사용하다가 고장이 났습니다.원하는 라이브러리 버전을 강제로 지정해야 합니다.다른 코멘트에서 언급했듯이 호환성 문제가 발생할 수 있지만 경우에 따라서는 필요한 경우도 있습니다.

내가 찾은 라이브러리 버전을 강제하는 가장 덜 거슬리는 방법은

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

종속성 구성을 강제로 지정:

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

Spring 버전을 일시적으로 다운그레이드할 필요가 있을 때(다음 릴리즈까지) 사용하였습니다.

의존관계 중 하나는 guava 버전을 강제로 업데이트하는 것입니다.gradle dependencies이치노

문제는 강제로 14.0.1을 사용하면 다른 라이브러리가 제대로 작동하지 않을 수 있다는 것입니다.17.0 버전을 의존관계로 사용할 수는 없습니까?

build.gradle에서 개별 버전 번호를 유지하는 대신 dependencies.gradle 파일을 사용합니다.이 파일은 버전 번호의 매핑을 포함하고 그것을 build.gradle로 가져옵니다.그러면 guava 버전만 유지하면 됩니다.예를 들면 다음과 같습니다.

의존관계.grade

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으로 이행하고 싶을 때는 dependences.gradle만 변경하면 됩니다.

또, 나는 과도 의존성을 false로 설정하는 것을 매우 좋아합니다.

configurations.compile { transitive = false }

이렇게 하면 컴파일 시 일부 종속성이 제거되지 않지만 제거 라이브러리가 완전히 하위 호환성이 없는 경우 실행 시 문제가 발생할 수 있습니다.코드를 작성하는 경우는, 사용하는 라이브러리를 알고, 의존 관계를 명확하게 할 필요가 있습니다.업그레이드 및 혼란으로부터 고객을 보호합니다.

또 다른 옵션은 의존성 제약 조건(https://docs.gradle.org/current/userguide/dependency_constraints.html)을 사용하는 것입니다.

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

설정에는 반대합니다.transitive = false이 방법에서는 의존관계 트리를 직접 수동으로 해결해야 합니다.

원하는 guava 버전을 강제로 실행할 수 있습니다.configurations.all또는 의존관계를 명시적으로 추가하여 설정합니다.forced = true.

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

이것은 Gradle 7.1에서 테스트된 Kotlin DSL(build.gradle.kts)용입니다.

dependencies {
    implementation("org.jsoup", "jsoup") {
        version {
            strictly("1.14.3")
        }
    }
}

다른 방법:

dependencies {
    implementation("org.jsoup:jsoup") {
        version {
            strictly("1.14.+") // You can also use dynamic versions
        }
    }
}

다른 답변에서 제시된 다른 방법:

configurations.all {
    resolutionStrategy {
        force("org.jsoup:jsoup:1.14.3")
        force("com.google.guava:guava-gwt:14.0.1")
    }
}

또는 spring-dependency-management Gradle 플러그인에서 dependencySets(또는 BOM POM을 사용할 수 있는 경우 mavenBom) 지원을 사용할 수 있습니다.이 플러그인은 스프링 부트 Gradle 플러그인에도 자동으로 적용됩니다.자세한 것은, 여기를 참조해 주세요.

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

두 종속성에 대해 모두 새 버전을 사용해도 괜찮다면, 문제를 해결하는 가장 간단한 방법은 종속성을 업데이트하는 것입니다.

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

그러면 둘 다 17.0이 됩니다.둘 다 이전 버전으로 강제하는 것보다 간단합니다.또, 새로운 버전의 보너스로 버그 수정이나 신기능이 부속되어 있는 경우도 있습니다.

@Klunk는 답변에서 "17.0 버전을 의존관계로 사용할 수 없느냐"고 말했지만, 그냥 지나쳐 놓치기 쉬우므로 별도의 답변으로 게시하는 것이 타당하다고 생각했다.

다음과 같이 라이브러리/의존성 버전을 그라데이션으로 "강제"할 수 있습니다.

    configurations.all {
        resolutionStrategy {
            force("org.jetbrains.kotlin:kotlin-stdlib:1.4.32",
                "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32", 
"org.jetbrains.kotlin:kotlin-reflect:1.4.32"
            )
        }
    }

상세한 것에 대하여는, https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html 를 참조해 주세요.

app/build.gradle

dependencies {
    compile('com.google.guava:guava') {
        version {
            strictly '14.0.1'
        }
    }
    compile('com.google.guava:guava-gwt') {
        version {
            strictly '14.0.1'
        }
    }
}

버전 그래들루

Gradle 6.7

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