本地运行正常的Spring Boot应用部署K8s时出现类找不到异常
问题
Spring Boot应用在本地环境可正常启动运行,但部署到Kubernetes集群时抛出NoClassDefFoundError,提示找不到org.springframework.core.env.Profiles类。
错误信息
java.lang.NoClassDefFoundError: org/springframework/core/env/Profiles at org.springframework.cloud.kubernetes.config.PropertySourceUtils.lambda$null$3(PropertySourceUtils.java:69) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:239) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:167) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:139) at org.springframework.beans.factory.config.YamlPropertiesFactoryBean.createProperties(YamlPropertiesFactoryBean.java:135) at org.springframework.beans.factory.config.YamlPropertiesFactoryBean.getObject(YamlPropertiesFactoryBean.java:115) at org.springframework.cloud.kubernetes.config.PropertySourceUtils.lambda$yamlParserGenerator$4(PropertySourceUtils.java:77) at java.util.function.Function.lambda$andThen$1(Function.java:88) at org.springframework.cloud.kubernetes.config.ConfigMapPropertySource.processAllEntries(ConfigMapPropertySource.java:149) at org.springframework.cloud.kubernetes.config.ConfigMapPropertySource.getData(ConfigMapPropertySource.java:100) at org.springframework.cloud.kubernetes.config.ConfigMapPropertySource.<init>(ConfigMapPropertySource.java:78) at org.springframework.cloud.kubernetes.config.ConfigMapPropertySourceLocator.getMapPropertySourceForSingleConfigMap(ConfigMapPropertySourceLocator.java:96) at org.springframework.cloud.kubernetes.config.ConfigMapPropertySourceLocator.lambda$locate$0(ConfigMapPropertySourceLocator.java:79) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.springframework.cloud.kubernetes.config.ConfigMapPropertySourceLocator.locate(ConfigMapPropertySourceLocator.java:78) at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:94) at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:628) at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:364) at org.springframework.boot.SpringApplication.run(SpringApplication.java:305) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) at com.daimler.daivb.msl.MbappsSnapLocalSearchServiceApplication.main(MbappsSnapLocalSearchServiceApplication.java:30) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) Caused by: java.lang.ClassNotFoundException: org.springframework.core.env.Profiles at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:419) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93) at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
应用依赖列表
- spring-boot-starter-web - 2.0.8.RELEASE
- gson - 2.3.1
- json-lib - 2.3
- spring-cloud-starter-kubernetes-config -1.1.10.RELEASE
- json - 20230227
- xmlrpc-client - 3.1.3
- spring-security-oauth2-autoconfigure - 2.0.8.RELEASE
- spring-security-config
- spring-security-web
- spring-cloud-starter-openfeign - 2.0.0.RELEASE
- spring-cloud-starter-netflix-ribbon - 2.0.0.RELEASE
- spring-boot-starter-actuator
- commons-lang3 - 3.8.1
- lombok
- spring-cloud-starter-config - 2.0.3.RELEASE
- micrometer-registry-prometheus - 1.2.2
- micrometer-core - 1.2.2
- spring-boot-starter-test
- spring-cloud-dependencies - Finchley.SR3
问题原因及解决方法
核心原因
org.springframework.core.env.Profiles类是Spring Framework 5.1版本才新增的,但你使用的Spring Boot 2.0.8.RELEASE依赖的是Spring Framework 5.0.x版本,版本不匹配导致类缺失。- Spring Cloud Finchley.SR3属于Finchley分支,对应的Spring Boot版本是2.0.x,而你使用的
spring-cloud-starter-kubernetes-config 1.1.10.RELEASE属于Greenwich分支,两个分支依赖的Spring Framework版本不一致,引发依赖冲突。
解决步骤
- 统一Spring Cloud组件版本:
将spring-cloud-starter-kubernetes-config改为Finchley分支兼容的版本(1.0.x.RELEASE),例如:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-kubernetes-config</artifactId> <version>1.0.4.RELEASE</version> </dependency> - 检查并修复依赖树:
使用依赖分析工具确认所有Spring Framework相关依赖版本统一为5.0.x:- Maven执行:
mvn dependency:tree - Gradle执行:
./gradlew dependencies
若发现高版本Spring Framework依赖被引入,手动在对应依赖中排除冲突模块。
- Maven执行:
- 验证打包完整性:
确保使用Spring Boot官方插件(spring-boot-maven-plugin或spring-boot-gradle-plugin)打包可执行Jar,保证所有依赖被正确打包到Jar包中,避免集群环境下依赖缺失。
内容的提问来源于stack exchange,提问作者Chaithra Shenoy
相关产品推荐
相关产品推荐

