Spring Boot项目在IntelliJ中无法运行,报NoClassDefFoundError错误
Spring Boot项目IntelliJ右键运行主类报NoClassDefFoundError,mvn命令可正常运行
错误信息
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication at com.shivam.org.myapp.MyappApplication.main(MyappApplication.java:10) Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication 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) ... 1 more
场景说明
- 环境:Spring Boot 3.0.6、Java 17,项目由Spring Initializr生成后导入IntelliJ
- 现象:通过
mvn spring-boot:run可正常启动项目,但右键运行MyappApplication.java主类时抛出上述异常 - 已尝试操作:设置JAVA_HOME为JDK17、删除本地.m2仓库内容、重启IntelliJ、移除之前添加的actuator和devtools依赖,问题仍未解决
Maven依赖树
PS C:\Users\shiva\Documents\spring-projects\myapp\myapp> mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ------------------------< com.shivam.org:myapp >------------------------ [INFO] Building myapp 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.3.0:tree (default-cli) @ myapp --- [INFO] com.shivam.org:myapp:jar:0.0.1-SNAPSHOT [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:3.0.6:provided [INFO] | +- org.springframework.boot:spring-boot-starter:jar:3.0.6:provided [INFO] | | +- org.springframework.boot:spring-boot:jar:3.0.6:provided [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:3.0.6:provided [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:3.0.6:provided [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.4.7:provided [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.4.7:provided [INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.19.0:provided [INFO] | | | | \- org.apache.logging.log4j:log4j-api:jar:2.19.0:provided [INFO] | | | \- org.slf4j:jul-to-slf4j:jar:2.0.7:provided [INFO] | | +- jakarta.annotation:jakarta.annotation-api:jar:2.1.1:provided [INFO] | | \- org.yaml:snakeyaml:jar:1.33:provided [INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:3.0.6:provided [INFO] | | +- com.fasterxml.jackson.core:jackson-databind:jar:2.14.2:provided [INFO] | | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.14.2:provided [INFO] | | | \- com.fasterxml.jackson.core:jackson-core:jar:2.14.2:provided [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.14.2:provided [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.14.2:provided [INFO] | | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.14.2:provided [INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:3.0.6:provided [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:10.1.8:provided [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:10.1.8:provided [INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:10.1.8:provided [INFO] | +- org.springframework:spring-web:jar:6.0.8:provided [INFO] | | +- org.springframework:spring-beans:jar:6.0.8:provided [INFO] | | \- io.micrometer:micrometer-observation:jar:1.10.6:provided [INFO] | | \- io.micrometer:micrometer-commons:jar:1.10.6:provided [INFO] | \- org.springframework:spring-webmvc:jar:6.0.8:provided [INFO] | +- org.springframework:spring-aop:jar:6.0.8:provided [INFO] | +- org.springframework:spring-context:jar:6.0.8:provided [INFO] | \- org.springframework:spring-expression:jar:6.0.8:provided [INFO] \- org.springframework.boot:spring-boot-starter-test:jar:3.0.6:test [INFO] +- org.springframework.boot:spring-boot-test:jar:3.0.6:test [INFO] +- org.springframework.boot:spring-boot-test-autoconfigure:jar:3.0.6:test [INFO] +- com.jayway.jsonpath:json-path:jar:2.7.0:test [INFO] | +- net.minidev:json-smart:jar:2.4.10:test [INFO] | | \- net.minidev:accessors-smart:jar:2.4.9:test [INFO] | | \- org.ow2.asm:asm:jar:9.3:test [INFO] | \- org.slf4j:slf4j-api:jar:2.0.7:provided [INFO] +- jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.0:test [INFO] | \- jakarta.activation:jakarta.activation-api:jar:2.1.1:test [INFO] +- org.assertj:assertj-core:jar:3.23.1:test [INFO] | \- net.bytebuddy:byte-buddy:jar:1.12.23:test [INFO] +- org.hamcrest:hamcrest:jar:2.2:test [INFO] +- org.junit.jupiter:junit-jupiter:jar:5.9.2:test [INFO] | +- org.junit.jupiter:junit-jupiter-api:jar:5.9.2:test [INFO] | | +- org.opentest4j:opentest4j:jar:1.2.0:test [INFO] | | +- org.junit.platform:junit-platform-commons:jar:1.9.2:test [INFO] | | \- org.apiguardian:apiguardian-api:jar:1.1.2:test [INFO] | +- org.junit.jupiter:junit-jupiter-params:jar:5.9.2:test [INFO] | \- org.junit.jupiter:junit-jupiter-engine:jar:5.9.2:test [INFO] | \- org.junit.platform:junit-platform-engine:jar:1.9.2:test [INFO] +- org.mockito:mockito-core:jar:4.8.1:test [INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.12.23:test [INFO] | \- org.objenesis:objenesis:jar:3.2:test [INFO] +- org.mockito:mockito-junit-jupiter:jar:4.8.1:test [INFO] +- org.skyscreamer:jsonassert:jar:1.5.1:test [INFO] | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test [INFO] +- org.springframework:spring-core:jar:6.0.8:provided [INFO] | \- org.springframework:spring-jcl:jar:6.0.8:provided [INFO] +- org.springframework:spring-test:jar:6.0.8:test [INFO] \- org.xmlunit:xmlunit-core:jar:2.9.1:test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.678 s [INFO] Finished at: 2023-04-22T19:43:10+05:30 [INFO] ------------------------------------------------------------------------ PS C:\Users\shiva\Documents\spring-projects\myapp\myapp>
问题根源
从依赖树可以看到,所有核心Spring Boot依赖(如spring-boot-starter-web、spring-boot)的范围都被设置为provided。这个范围表示依赖仅在编译、测试阶段可用,运行时不会被加入类路径。
mvn spring-boot:run命令会自动处理provided范围的依赖,将其纳入运行类路径,所以能正常启动;但IntelliJ右键运行主类时,会使用默认的类路径配置,不会自动包含provided依赖,导致找不到SpringApplication类。
解决步骤
- 修改pom.xml依赖范围:移除所有核心Spring Boot依赖的
<scope>provided</scope>标记,恢复默认的compile范围(默认可省略不写)。例如:<!-- 修改前 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>provided</scope> </dependency> <!-- 修改后 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> - 刷新Maven项目:在IntelliJ的Maven面板中点击「Reload All Maven Projects」按钮,重新加载依赖。
- 重新运行主类:右键点击
MyappApplication.java选择「Run」,此时类路径会包含所有必要依赖,即可正常启动。
若修改后问题仍存在,可尝试:
- 执行
mvn clean install重新构建项目 - 在IntelliJ中选择「File → Invalidate Caches... → Invalidate and Restart」清理缓存并重启IDE
内容的提问来源于Stack Exchange,提问作者Shivam
相关产品推荐
相关产品推荐

