You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot从2.2.2升级到3.5.6启动时遇NoClassDefFoundError问题求助

Spring Boot从2.2.2升级到3.5.6启动时遇NoClassDefFoundError问题求助

兄弟,我帮你捋捋这个升级踩的坑——你遇到的Could not find or load main class com.myapp.Application本质是因为NoClassDefFoundError: org.springframework.web.WebApplicationInitializer,核心问题集中在依赖配置错误Java EE到Jakarta EE的迁移不彻底,咱们一步步解决:

1. 最紧急的问题:依赖范围完全用错了

你几乎把所有依赖都标记成了compileOnly,这个范围的意思是仅在编译阶段生效,运行时不会将这些依赖加入类路径或打包。像Spring Boot Starter Web、Spring Context这种核心运行依赖,绝对不能用compileOnly

正确的依赖范围规则:

  • 所有程序运行时必须的依赖(比如Spring Boot starters、数据库驱动、Redis客户端等)用implementation(编译+运行时都生效)
  • 只有纯编译辅助工具(比如代码生成器、注解处理器、仅编译阶段用的模板引擎)才用compileOnly

比如你现在的org.springframework.boot:spring-boot-starter-web:3.5.6必须改成implementation,不然Spring Web的核心类(包括WebApplicationInitializer)启动时根本找不到。

2. Jakarta EE迁移不彻底,javax和jakarta依赖混着用

Spring Boot 3.x完全基于Jakarta EE规范,彻底抛弃了Java EE的javax.*包,全部替换为jakarta.*。你现在的依赖里还混着大量旧的javax依赖,这必然导致类加载冲突:

  • 删掉javax.servlet:javax.servlet-api:4.0.1,只保留jakarta.servlet:jakarta.servlet-api(版本和Spring Boot 3.5.6兼容即可,它默认用6.0.x,你用6.1.0也没问题)
  • javax.jms-api:2.0.1 → 替换为jakarta.jms:jakarta.jms-api:3.1.0
  • javax.mail:mail:1.4.1 → 替换为com.sun.mail:jakarta.mail:2.0.1
  • 所有其他javax.*开头的依赖,全部找对应的jakarta.*版本替换

3. 依赖版本严重不兼容

Spring Boot 3.5.6对应的Spring Framework是6.1.x,你现在还依赖大量旧版本的组件,版本冲突直接导致类找不到:

  • 删掉手动指定的org.springframework:spring-context-support:5.0.8.RELEASE,Spring Boot的starter已经包含了这个模块的兼容版本,手动引旧版本会直接和Spring 6.x冲突
  • Hibernate版本5.4.10.Final太老,Spring Boot 3.x需要Hibernate 6.x以上,建议直接用spring-boot-starter-data-jpa,它会自动管理Hibernate的兼容版本
  • 旧的spring-security-oauth2:2.3.4.RELEASE已经被废弃,Spring Boot 3.x要用Spring Security 6.x的OAuth2支持,比如替换为spring-boot-starter-oauth2-clientspring-boot-starter-oauth2-resource-server
  • 像Camel、hibernate-redis这类第三方组件,必须升级到支持Spring 6和Jakarta EE的版本,旧版本完全不兼容

4. 主类和JDK版本的小细节

  • 确保你的主类com.myapp.Application上的@SpringBootApplication注解是org.springframework.boot.autoconfigure.SpringBootApplication,没导错包,且主类在项目根包下(Spring Boot默认扫描主类所在包及子包的组件)
  • Spring Boot 3.x最低要求Java 17,你之前用的Spring Boot 2.2.2是Java 8,必须升级JDK到17或更高版本

给你一个简化的正确依赖示例

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.6'
    id 'io.spring.dependency-management' version '1.1.6'
}

dependencies {
    // 核心Spring Boot运行依赖,用implementation
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-context-support'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

    // 数据库驱动用runtimeOnly(仅运行时需要)
    runtimeOnly 'mysql:mysql-connector-java:8.0.33'

    // 仅编译阶段用的工具,保留compileOnly
    compileOnly 'org.codehaus.groovy:groovy-all:3.0.17' // 升级到兼容Java17的版本
    compileOnly 'org.apache.velocity:velocity-engine-core:2.3' // 旧velocity1.7不兼容Jakarta

    // 测试依赖
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

java {
    sourceCompatibility = '17' // Spring Boot3.x最低要求Java17
}

最后建议的修复步骤

  1. 先把所有核心运行依赖的compileOnly改成implementation,这是最快能验证是否解决WebApplicationInitializer找不到的问题的步骤
  2. 升级JDK到17+
  3. 逐步替换所有javax.*依赖为jakarta.*版本
  4. 删掉所有和Spring 6.x不兼容的旧版本第三方组件,替换为兼容版本
  5. 尽量用Spring Boot的starter依赖,减少手动指定版本的情况,避免版本冲突

火山引擎 最新活动