SpringBoot 3.3.x云环境部署失败:HttpClient类找不到错误
问题
原本使用SpringBoot 3.2.2时,项目在云环境运行无异常。但升级至3.3.3及3.3.4版本后,部署均失败,报错为java.lang.NoClassDefFoundError: java/net/http/HttpClient,错误栈指向Hazelcast的Kubernetes客户端逻辑。
运行环境:Java17、Rocky9、Tomcat:10.1.26-1.1-rocky9-jre17,回退至SpringBoot3.2.2则恢复正常。
请问基于Spring Framework6.1的SpringBoot3.3.x在Kubernetes自动配置上是否有变化?
以下是HazelcastConfig.java代码片段:
@Bean public HazelcastInstance embeddedHazelcast() { Config hazelcastConfig = new Config(); hazelcastConfig.setInstanceName("catalog"); hazelcastConfig.setClusterName(clusterName); hazelcastConfig.getNetworkConfig().setPort(port).setPortAutoIncrement(false); hazelcastConfig.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); hazelcastConfig.getNetworkConfig().getInterfaces().addInterface(networkInterface).setEnabled(false); if (StringUtils.isBlank(members)) { members = discover(); } else { // add other hazelcast members including this instance members = networkInterface + ":" + hazelcastConfig.getNetworkConfig().getPort() + (StringUtils.isNotBlank(members) ? "," : "") + members; } logger.info("Cache members List" + members); if(catCacheEnabled){ if(isContainerisedEnv){ hazelcastConfig.getNetworkConfig().getJoin().getKubernetesConfig().setEnabled(catCacheEnabled) .setProperty("namespace",k8sNameSpace) .setProperty("service-name",k8sServiceName); }else{ hazelcastConfig.getNetworkConfig().getJoin().getTcpIpConfig().addMember(members).setEnabled(catCacheEnabled); } }else{ hazelcastConfig.getNetworkConfig().getJoin().getAutoDetectionConfig().setEnabled(catCacheEnabled); //Cache is disabled } HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(hazelcastConfig); return hazelcastInstance; }
分析与解决方案
Spring Boot 3.3.x(基于Spring Framework 6.1)并未大幅修改Kubernetes自动配置逻辑,问题根源在于Hazelcast版本升级带来的依赖变化:
- Spring Boot 3.2.x默认依赖Hazelcast 5.3.x,3.3.x升级到了Hazelcast 5.4.x。
- Hazelcast 5.4.x的Kubernetes客户端改用JDK自带的
java.net.http.HttpClient,但你的Tomcat镜像属于精简版JRE环境,缺失了该模块。
针对这个问题,可采取以下几种解决方式:
- 补充JDK HTTP客户端模块:在项目构建文件中添加依赖,或在Tomcat启动参数中显式引入模块
- Maven依赖示例:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jakartaee-migration</artifactId> <version>1.0.0</version> <scope>provided</scope> </dependency> - 启动参数添加:
--add-modules java.net.http
- Maven依赖示例:
- 强制指定Hazelcast版本:在项目中锁定Hazelcast为5.3.x版本,匹配Spring Boot 3.2.x的依赖
- Maven示例:
<properties> <hazelcast.version>5.3.6</hazelcast.version> </properties>
- Maven示例:
- 更换完整JDK镜像:替换当前Tomcat镜像为包含完整JDK的版本,避免精简版JRE缺失核心模块
你的手动配置Hazelcast Kubernetes发现的逻辑本身没有问题,报错仅为类路径缺失导致,与Spring Boot的Kubernetes自动配置变更无关。
内容的提问来源于stack exchange,提问作者Subodh Joshi
相关产品推荐
相关产品推荐

