升级Zuul与Auth的JDBC驱动后Eureka服务启动异常
升级Oracle JDBC驱动至12.2.0.jre8后Eureka DiscoveryClient初始化失败的解决方案
问题现象
升级Zuul和Auth微服务的Oracle JDBC驱动到12.2.0.jre8版本后,Eureka客户端启动抛出如下异常,最终导致DiscoveryClient初始化失败:
Caused by: java.lang.RuntimeException: Failed to initialize DiscoveryClient! ... Caused by: java.lang.RuntimeException: Cannot create Jersey client ... Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
根因分析
Oracle JDBC驱动12.2.0.jre8版本内置了JAX-RS 2.0的相关依赖(如javax.ws.rs-api),而Eureka客户端默认依赖的是Jersey 1.x(基于JAX-RS 1.1规范)。当驱动包中的JAX-RS 2.0类被优先加载时,RuntimeDelegate会尝试寻找JAX-RS 2.0的实现类org.glassfish.jersey.internal.RuntimeDelegateImpl,但该类并未被完整引入到项目依赖中,从而触发类找不到的异常。
解决方案
方案1:排除JDBC驱动中的JAX-RS相关依赖
通过构建工具(Maven/Gradle)排除Oracle驱动包中自带的JAX-RS及Jersey 2.x依赖,避免与Eureka的Jersey 1.x冲突:
Maven配置示例:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>12.2.0.jre8</version> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> </exclusion> <exclusion> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> </exclusion> <exclusion> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> </exclusion> </exclusions> </dependency>
Gradle配置示例:
implementation('com.oracle.database.jdbc:ojdbc8:12.2.0.jre8') { exclude group: 'javax.ws.rs', module: 'javax.ws.rs-api' exclude group: 'org.glassfish.jersey.core', module: 'jersey-client' exclude group: 'org.glassfish.jersey.core', module: 'jersey-common' }
方案2:强制引入JAX-RS 1.1依赖
显式添加JAX-RS 1.1的规范依赖,覆盖驱动包带来的JAX-RS 2.0版本,适配Eureka的Jersey 1.x:
Maven配置示例:
<dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> <version>1.1.1</version> </dependency>
Gradle配置示例:
implementation 'javax.ws.rs:jsr311-api:1.1.1'
方案3:切换Eureka客户端的HTTP实现
将Eureka客户端的HTTP客户端从Jersey 1.x切换为RestClient(或OkHttp),彻底规避Jersey版本冲突:
- 修改配置文件:
# 启用RestClient作为Eureka HTTP客户端 eureka.client.httpClient.enabled=false eureka.client.restClient.enabled=true
- 排除Jersey依赖(可选):
如果项目中不需要Jersey 1.x,可以在Eureka客户端依赖中排除相关包:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <exclusions> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> </exclusion> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者Padmaja
相关产品推荐
相关产品推荐

