OCI Java SDK 3.42与Spring Boot 3.3不兼容?报LinkageError错误
OCI ObjectStorage客户端构建时的LinkageError问题
问题说明
使用Spring Boot 3.3.0搭配OCI Java SDK 3.42.0构建ObjectStorage客户端时,抛出LinkageError类加载冲突错误,希望保留最新版本前提下解决该问题。
gradle.build配置
plugins { id 'java' id 'org.springframework.boot' version '3.3.0' // 引发错误的版本 id 'io.spring.dependency-management' version '1.1.5' } group = 'org.example' version = '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation group: 'com.oracle.oci.sdk', name: 'oci-java-sdk-addons-resteasy-client-configurator', version: '3.42.0' implementation group: 'com.oracle.oci.sdk', name: 'oci-java-sdk-objectstorage', version: '3.42.0' implementation group: 'com.oracle.oci.sdk', name: 'oci-java-sdk-common-httpclient-jersey', version: '3.42.0' } test { useJUnitPlatform() }
业务代码
package org.example; import java.io.IOException; import com.oracle.bmc.ConfigFileReader; import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider; import com.oracle.bmc.objectstorage.ObjectStorage; import com.oracle.bmc.objectstorage.ObjectStorageClient; public class ObjectStorageConfig { // OCI配置文件路径 String configurationFilePath = "config"; String profile = "DEFAULT"; public ObjectStorage getObjectStorage() throws IOException { // 加载配置文件 final ConfigFileReader.ConfigFile configFile = ConfigFileReader .parse(configurationFilePath, profile); final ConfigFileAuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(configFile); // 构建并返回客户端 return ObjectStorageClient.builder() .build(provider); } }
运行时错误栈
Exception in thread "main" java.lang.LinkageError: ClassCastException: attempting to castjar:file:/C:/Users/adekc/.gradle/caches/modules-2/files-2.1/org.jboss.spec.javax.ws.rs/jboss-jaxrs-api_2.1_spec/2.0.1.Final/75cdeb26ccf87bc6f9d0f31b5ec4d80aa15b662c/jboss-jaxrs-api_2.1_spec-2.0.1.Final.jar!/javax/ws/rs/client/ClientBuilder.class to jar:file:/C:/Users/adekc/.gradle/caches/modules-2/files-2.1/org.jboss.spec.javax.ws.rs/jboss-jaxrs-api_2.1_spec/2.0.1.Final/75cdeb26ccf87bc6f9d0f31b5ec4d80aa15b662c/jboss-jaxrs-api_2.1_spec-2.0.1.Final.jar!/javax/ws/rs/client/ClientBuilder.class at javax.ws.rs.client.ClientBuilder.newBuilder(ClientBuilder.java:97) at com.oracle.bmc.http.client.jersey.JerseyHttpClientBuilder.build(JerseyHttpClientBuilder.java:306) at com.oracle.bmc.http.internal.BaseClient.setEndpoint(BaseClient.java:422) at com.oracle.bmc.http.internal.BaseClient.setRegion(BaseClient.java:457) at com.oracle.bmc.objectstorage.ObjectStorageClient.setRegion(ObjectStorageClient.java:152) at com.oracle.bmc.http.internal.BaseClient.<init>(BaseClient.java:169) at com.oracle.bmc.http.internal.BaseSyncClient.<init>(BaseSyncClient.java:36) at com.oracle.bmc.objectstorage.ObjectStorageClient.<init>(ObjectStorageClient.java:49) at com.oracle.bmc.objectstorage.ObjectStorageClient$Builder.build(ObjectStorageClient.java:145) at org.example.ObjectStorageConfig.getObjectStorage(ObjectStorageConfig.java:31) at org.example.FileService.getFileObject(FileService.java:50) at org.example.NewMain.main(NewMain.java:9)
解决方案
核心原因
Spring Boot 3.x基于Jakarta EE 9+,使用jakarta.ws.rs命名空间的JAX-RS API;而原OCI SDK依赖的oci-java-sdk-common-httpclient-jersey是基于旧的javax.ws.rs命名空间,导致类加载冲突。
修复步骤
替换OCI HTTP客户端依赖为Jakarta兼容版本
将原依赖oci-java-sdk-common-httpclient-jersey替换为Jakarta适配版本:implementation group: 'com.oracle.oci.sdk', name: 'oci-java-sdk-common-httpclient-jersey-jakarta', version: '3.42.0'排除冲突的旧JAX-RS API依赖
为确保没有残留的javax.ws.rs依赖,可在OCI相关依赖中排除冲突包:dependencies { implementation('com.oracle.oci.sdk:oci-java-sdk-addons-resteasy-client-configurator:3.42.0') { exclude group: 'org.jboss.spec.javax.ws.rs', module: 'jboss-jaxrs-api_2.1_spec' } implementation('com.oracle.oci.sdk:oci-java-sdk-objectstorage:3.42.0') { exclude group: 'org.jboss.spec.javax.ws.rs', module: 'jboss-jaxrs-api_2.1_spec' } implementation group: 'com.oracle.oci.sdk', name: 'oci-java-sdk-common-httpclient-jersey-jakarta', version: '3.42.0' }验证依赖一致性
执行gradle dependencies命令,检查是否还有javax.ws.rs相关依赖,确保所有JAX-RS API都为jakarta.ws.rs版本。
调整后的完整gradle.build配置:
plugins { id 'java' id 'org.springframework.boot' version '3.3.0' id 'io.spring.dependency-management' version '1.1.5' } group = 'org.example' version = '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation('com.oracle.oci.sdk:oci-java-sdk-addons-resteasy-client-configurator:3.42.0') { exclude group: 'org.jboss.spec.javax.ws.rs', module: 'jboss-jaxrs-api_2.1_spec' } implementation('com.oracle.oci.sdk:oci-java-sdk-objectstorage:3.42.0') { exclude group: 'org.jboss.spec.javax.ws.rs', module: 'jboss-jaxrs-api_2.1_spec' } implementation group: 'com.oracle.oci.sdk', name: 'oci-java-sdk-common-httpclient-jersey-jakarta', version: '3.42.0' } test { useJUnitPlatform() }
内容的提问来源于stack exchange,提问作者adekcz
相关产品推荐
相关产品推荐

