프로젝트에 호환 가능한 Cloud 클라이언트 라이브러리 버전이 포함되도록 하려면 Google Cloud라이브러리 자재명세서 (BOM)에 지정된 버전을 사용합니다. BOM의 라이브러리에는 NoSuchMethodError 또는 NoClassDefFoundError로 나타나는 종속 항목 충돌이 없습니다.
BOM은 Google이 Google Cloud에서 서비스를 더 쉽게 사용할 수 있도록 지원하는 200개가 넘는 오픈소스 Java 라이브러리를 게시하기 때문에 필요합니다.Google Cloud 라이브러리는 일반적인 용도로 사용할 수 있는 여러 기본 라이브러리에 종속됩니다.
이 권장사항은 다음 라이브러리의 구성요소에 적용됩니다.
BOM을 사용하도록 프로젝트 업데이트
프로젝트에서 호환 가능한 라이브러리 및 구성요소 아티팩트 버전을 사용하도록 하려면 com.google.cloud:libraries-bom을 가져오고 BOM을 사용하여 종속 항목 버전을 지정합니다. 이전에 설정한 버전을 모두 삭제해야 합니다.
protobuf-java 4.x와의 호환성 문제가 발생하는 경우 코드베이스와 종속 항목을 업데이트하여 호환성을 보장하세요. 잠재적인 호환성 문제는 libraries-bom v26.50.0 및 libraries-bom v26.75.0 출시 노트를 참고하세요.
Maven
pom.xml 파일의 dependencyManagement 섹션에서 BOM을 가져옵니다.
dependencies 섹션에 의존하는 특정 아티팩트를 포함하되 dependencies 섹션에 아티팩트의 버전을 지정하지 마세요. 아래 예시는 BOM을 가져오고 google-cloud-storage 아티팩트를 포함하는 방법을 보여줍니다.
이 예시에서는 BOM이 라이브러리 버전을 관리하므로 google-cloud-storage 버전이 생략됩니다.
Gradle
BOM은 기본적으로 Gradle 5.x 이상에서 지원됩니다. com.google.cloud:libraries-bom에 platform 종속 항목을 추가하고 아티팩트의 build.gradle 파일에 있는 종속 항목 선언에서 버전을 삭제합니다.
platform 및 enforcedPlatform 키워드는 BOM에 선언된 종속 항목 버전을 제공합니다. enforcedPlatform 키워드는 BOM에 선언된 종속 항목 버전을 적용하므로 지정된 항목을 재정의합니다.
Gradle 5.x 이상의 platform 및 enforcedPlatform 키워드에 대한 자세한 내용은 Gradle: Maven BOM 가져오기를 참조하세요.
Gradle 4.6 이상을 사용하는 경우 settings.gradle 파일에 enableFeaturePreview('IMPROVED_POM_SUPPORT')를 추가합니다.
자세한 내용은 Gradle 4.6 출시 노트: BOM 가져오기를 참조하세요.
4.6 이전 버전의 Gradle은 BOM을 지원하지 않습니다.
SBT
SBT는 BOM을 지원하지 않습니다. 대시보드에서 특정 BOM 버전의 권장 라이브러리 버전을 확인하고 버전을 수동으로 설정할 수 있습니다.
Bazel
Bazel은 BOM을 지원하지 않습니다. 대시보드에서 특정 BOM 버전의 권장 라이브러리 버전을 찾아 수동으로 설정할 수 있습니다.
Guava 버전 -jre 또는 -android
버전 21.0.0이 출시된 이후 라이브러리 BOM에는 Java 8 이상을 지원하는 Guava의 -jre 버전이 포함됩니다. 아래 섹션은 Java 8 사용자에게는 적용되지 않습니다.
Google의 Guava 출시에는 '-jre' 버전과 '-android' 버전의 두 가지 버전의 아티팩트가 포함되어 있습니다.
'-jre'가 포함된 버전(예: com.google.guava:guava:31.1-jre)은 자바 8용이며 람다 함수 및 스트림을 지원합니다.
'-android' 접미사가 있는 다른 버전 (예: com.google.guava:guava:31.1-android)은 Java 7 및 Android 개발용입니다.
Google Cloud 라이브러리 BOM에는 BOM이 Java 7에서 작동하도록 '-android' 버전의 Guava가 포함되어 있습니다. 하지만 이는 BOM의 Guava 버전에 Java 8 람다 함수용으로 의도된 일부 메서드(예: ImmutableList.toImmutableList())가 없다는 의미입니다.
프로젝트에 자바 8 이상이 필요하며 com.google.common.collect.Streams와 같은 Guava 클래스를 사용하는 경우 Guava의 JRE 버전에 대한 종속 항목을 추가해야 합니다.
Maven의 경우:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version> <!-- "-jre" for Java 8 or higher -->
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
...
</dependencyManagement>
Gradle의 경우:
dependencies {
constraints {
implementation 'com.google.guava:guava:31.1-jre' // "-jre" for Java 8 or higher
}
implementation platform('com.google.cloud:libraries-bom:26.12.0')
...
}
enforcedPlatform을 사용하는 경우 enforcedPlatform이 constraints보다 우선 적용되므로 이전 샘플은 작동하지 않습니다. Guava 버전과 함께 enforcedPlatform를 사용하려면 ResolutionStrategy를 구성하면 됩니다.