升级Java8至Java17后Spring Boot启动报错求助
问题背景
将Java版本从8升级到17,Spring Boot从1.3.3.RELEASE升级到2.7.12后,启动应用抛出以下异常:
Exception in thread "main" java.lang.NoClassDefFoundError:
org/springframework/core/metrics/ApplicationStartup at
org.springframework.boot.SpringApplication.(SpringApplication.java:232)
at
org.springframework.boot.SpringApplication.(SpringApplication.java:245)
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
at
com.aujas.keystore.microservice.KeystoreController.main(KeystoreController.java:43)
Caused by: java.lang.ClassNotFoundException:
org.springframework.core.metrics.ApplicationStartup at
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 5 more
原pom.xml配置
<groupId>codesign</groupId> <artifactId>microservice</artifactId> <version>0.0.2-SNAPSHOT</version> <packaging>jar</packaging> <name>microservice</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.12</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcmail-jdk16</artifactId> <version>1.46</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpg-jdk15on</artifactId> <version>1.49</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-processing</artifactId> <version>2.19</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.20</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> </dependency> <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> </dependency> <dependency> <groupId>biz.paluch.logging</groupId> <artifactId>logstash-gelf</artifactId> <version>1.11.2</version> </dependency> <!-- Add Log4j2 Dependency --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
已更新的部分依赖
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcmail-jdk16</artifactId> <version>1.46</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpg-jdk15on</artifactId> <version>1.49</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-processing</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>3.1.2</version> </dependency>
问题根源
ApplicationStartup是Spring Framework 5.1+新增的类,但当前配置中Spring Cloud使用的Brixton.RC1版本属于非常老旧的分支,仅兼容Spring Boot 1.3.x,会强制引入低版本的Spring Framework,与Spring Boot 2.7.12依赖的Spring Framework 5.3.x产生版本冲突,导致类加载失败。
修复步骤
1. 升级Spring Cloud依赖版本
Spring Boot 2.7.12对应的Spring Cloud稳定版本是2021.0.8(Jubilee SR8),修改dependencyManagement部分:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.8</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
2. 替换Zuul依赖
原spring-cloud-starter-zuul已废弃,改用兼容当前版本的Netflix Zuul starter:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
3. 清理冲突依赖
- 移除
com.sun.jersey:jersey-client依赖,它与Glassfish Jersey 3.x存在包冲突 - 更新BouncyCastle版本至兼容Java 17的版本,替换老旧的
bcmail-jdk16:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcmail-jdk15on</artifactId> <version>1.70</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpg-jdk15on</artifactId> <version>1.70</version> </dependency>
4. 统一Jersey与JAX-RS版本
Jersey 3.x对应JAX-RS 3.0,需将javax.ws.rs-api替换为Jakarta EE的jakarta.ws.rs-api:
<dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.0.1</version> </dependency>
5. 刷新依赖缓存
执行Maven命令强制清理并重新构建:
mvn clean install -U
内容的提问来源于stack exchange,提问作者Raj

