Spring Cloud Edgware中Jersey未定义及Spring Boot服务升级问题咨询
刚处理过类似的升级踩坑问题,给你梳理下一步步排查和解决的思路:
先把版本对应关系捋清楚
首先得提个关键坑:Spring Cloud Edgware和Spring Boot有严格的版本匹配要求——它只兼容Spring Boot 1.5.9.RELEASE及以上的1.5.x版本。你原来用的是1.5.5,如果直接升级Spring Cloud Services Dependencies到Edgware系列,不同版本的依赖肯定会打架,这大概率是问题根源。
一步步排查问题
1. 拉取依赖树,揪出Jersey的问题
先跑个Maven命令,把和Jersey相关的依赖树打出来,看看是缺了依赖还是版本冲突:
mvn dependency:tree -Dincludes=javax.ws.rs,jersey
重点盯这两点:
- 有没有
javax.ws.rs-api、jersey-core这类核心Jersey依赖被意外排除了 - 是不是有不同模块引入了不同版本的Jersey(比如旧版Spring Boot带的Jersey和Edgware要求的版本不兼容)
2. 确认Spring Cloud Services Dependencies的版本是否正确
Edgware对应的Spring Cloud Services Dependencies版本是1.6.x.RELEASE系列(比如1.6.4.RELEASE是比较稳定的版本),如果升级时版本号没对应上,也会导致依赖紊乱。
针对性解决方法
方法1:先把Spring Boot版本对齐到兼容范围
先把Spring Boot parent的版本升级到Edgware支持的1.5.x最新稳定版(比如1.5.22.RELEASE,尽量用同大版本的最后一个稳定版,bug最少):
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.22.RELEASE</version> <relativePath/> </parent>
然后对应引入Edgware版的Spring Cloud Services Dependencies:
<dependency> <groupId>io.pivotal.spring.cloud</groupId> <artifactId>spring-cloud-services-dependencies</artifactId> <version>1.6.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
方法2:显式补全缺失的Jersey依赖
如果依赖树显示某些Jersey核心依赖没拉到,直接在POM里手动引入这些依赖,下面的版本是Edgware默认兼容的,放心用:
<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.25.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.25.1</version> </dependency>
方法3:排除冲突的旧版Jersey依赖
如果是第三方依赖引入了旧版的Jersey(比如jsr311-api这种Jersey 1.x的依赖),找到那个搞事情的依赖,把旧版Jersey排除掉:
<dependency> <groupId>你的冲突依赖groupId</groupId> <artifactId>你的冲突依赖artifactId</artifactId> <version>对应版本</version> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> </exclusion> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> </exclusion> </exclusions> </dependency>
方法4:检查Jersey相关代码的适配
如果你代码里用了Jersey的特定API,升级后可能有些类的包路径或者方法有小变化——不过因为你是同Spring Boot大版本升级,这个概率比较小,但如果前面的方法都没用,就去看看报错的类是不是有API变更。
验证步骤
改完POM后,先跑mvn clean install看看编译过不过;然后启动服务,盯着启动日志,看有没有Jersey相关的ClassNotFoundException或者NoClassDefFoundError,如果没了就搞定了。
内容的提问来源于stack exchange,提问作者Charles B

