You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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环境,缺失了该模块。

针对这个问题,可采取以下几种解决方式:

  1. 补充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
      
  2. 强制指定Hazelcast版本:在项目中锁定Hazelcast为5.3.x版本,匹配Spring Boot 3.2.x的依赖
    • Maven示例:
      <properties>
          <hazelcast.version>5.3.6</hazelcast.version>
      </properties>
      
  3. 更换完整JDK镜像:替换当前Tomcat镜像为包含完整JDK的版本,避免精简版JRE缺失核心模块

你的手动配置Hazelcast Kubernetes发现的逻辑本身没有问题,报错仅为类路径缺失导致,与Spring Boot的Kubernetes自动配置变更无关。

内容的提问来源于stack exchange,提问作者Subodh Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:32:36