Springboot项目启动报错java.lang.IllegalStateException和java.lang.NoClassDefFoundError

在IDEA开发工具中启动一个springboot项目时报错

Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class
org.springframework.boot.web.support.SpringBootServletInitializer
        at org.springframework.core.type.StandardAnnotationMetadata.
        getAnnotatedMethods(StandardAnnotationMetadata.java:163) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        at org.springframework.context.annotation.ConfigurationClassParser.
        retrieveBeanMethodMetadata(ConfigurationClassParser.java:380) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        at org.springframework.context.annotation.ConfigurationClassParser.
        doProcessConfigurationClass(ConfigurationClassParser.java:314) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        at org.springframework.context.annotation.ConfigurationClassParser.
        processConfigurationClass(ConfigurationClassParser.java:245) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        at org.springframework.context.annotation.ConfigurationClassParser.
        parse(ConfigurationClassParser.java:198) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        at org.springframework.context.annotation.ConfigurationClassParser.
        parse(ConfigurationClassParser.java:167) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        ... 17 common frames omitted 
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext
        at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_111]
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_111]
        at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_111]
        at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods
        (StandardAnnotationMetadata.java:152) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        ... 22 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_111]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_111]
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_111]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_111]
        ... 26 common frames omitted

后通过同事帮我解决的,后期通过查询主要原因配置的scope问题

<dependency>  
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>  // 开始的配置
</dependency>
 将scope中的provided修改为compile就好了   <scope>compile</scope>(感觉就是作用域的范围不符合要求)

主要原因:

              在Intellij IDEA中所有 scope 为 provided 的依赖都是不会被加入到 classpath 中的,目前该bug尚未被修复((bug report)。如果你的web应用是部署到容器中的,那么这个bug不会影响使用,因为web应用中provided的依赖在容器运行时会被提供。如果你做spring Boot开发,有带provided的依赖时,直接在IntellIJ IDEA中运行项目会导致ClassNotFound异常。所以当jar需要被加入到classpath中需要注释<scope>provided</scope>,或者更改为:<scope>compile</scope>Intellij Idea下运行Spring Boot关于provided依赖不加入classpath的bug与解决方案。

  • compile
    默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布
  • provided
    跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIS。这个scope 只能作用在编译和测试时,同时没有传递性。

猜你喜欢

转载自blog.csdn.net/weixin_41858337/article/details/87983303