Spring Boot java.lang.NoClassDefFoundError: javax/servlet/Filter

我使用 SpringBoot1.2.3启动了一个新项目

java.lang.NoClassDefFoundError: javax/servlet/Filter

等级依赖:

dependencies {
compile("org.springframework.boot:spring-boot-starter-actuator")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.codehaus.groovy:groovy")
compile("com.h2database:h2")
compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity3")


providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
testCompile("org.springframework.boot:spring-boot-starter-test")


compile 'org.webjars:jquery:2.1.4'
compile 'org.webjars:bootstrap:3.3.4'
}

这是完整的堆栈跟踪

Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Filter
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2570)
at java.lang.Class.getMethod0(Class.java:2813)
at java.lang.Class.getMethod(Class.java:1663)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:125)
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 29 more


Process finished with exit code 1
177654 次浏览

这看起来像是您试图将库 servlet.jarservlet-api.jar添加到您的项目 /lib/文件夹中,但是 Tomcat 已经为您提供了这些库。从项目和类路径中删除它们。在项目或类路径中的任何位置搜索并删除它。

providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

这应该是

compile("org.springframework.boot:spring-boot-starter-tomcat")

对于专家用户来说, 评论下列附属部分提供的范围:

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>

更新

正如 feed. me 提到的,根据所部署的应用程序类型,您必须取消对提供的部分的注释。

下面是一个有用的详细信息链接: Http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging

IDE (在本例中是 IntelliJ)的一些有趣之处在于:

  • 如果您保留默认值,即 不要申报 弹簧-靴子-启动器-公猫提供,那么 Spring-boot-maven-plugin(SBMP)将 tomcat 的 jar 放入 war-> ,那么在将 war 部署到容器时可能会出现错误(可能存在版本冲突)

  • 否则,您将在 公猫嵌入上获得带有 没有编译依赖性的类路径(SBMP 将构建包含 提供了深度的可执行 war/jar)

    • IntelliJ 在运行它的 Spring Boot运行配置时,实际上在运行时看不到 提供了深度(它们不在类路径中)。
    • 如果没有 tomcat 嵌入,就不能使用嵌入式 servlet 容器运行 Spring-Boot。

有一些棘手的变通方法: 通过 UI: File->Project Structure->(Libraries or Modules/Dependencies tab)将 Tomcat 的 jar 放到 idea-module 的类路径中。

  • 公猫嵌入核心
  • 公猫-嵌入-艾尔
  • Tomcat 嵌入式网络插座
  • 公猫-嵌入-记录-朱莉

maven病例更好的解决方案

与其在 Ideas 中添加模块依赖项,不如使用 弹簧-靴子-启动器-公猫库的编译作用域声明 maven 配置文件。

<profiles>
<profile>
<id>embed-tomcat</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</profile>
</profiles>

spring-boot-starter-tomcat<dependencies/>中声明为 提供,而在 IDE 或 CLI (mvn -Pembed-tomcat ...)中声明为 激活这个侧写,则允许您使用嵌入的 tomcat 启动构建。

配置 给你正在为我工作:

configurations {
customProvidedRuntime
}


dependencies {
compile(
// Spring Boot dependencies
)


customProvidedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
}


war {
classpath = files(configurations.runtime.minus(configurations.customProvidedRuntime))
}


springBoot {
providedConfiguration = "customProvidedRuntime"
}

添加以下依赖项。范围应该被编译,然后它将工作。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>

更改应用程序依赖项的范围是不好的。将依赖项作为编译,将在您的工件中提供将要安装的依赖项。 最好的做法是按 指明如文件所述配置您的 Spring 启动应用程序的 RUN 配置:

“包含具有‘提供’作用域的依赖项”“启用此选项以 将提供范围的依赖项添加到运行时类路径。”

enter image description here

为了 Jar

添加 pom.xml

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

在我的案例中,这个依赖项的作用域是 provided

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

我也有同样的问题。 由 java.lang. ClassNotFoundException: javax.servlet. Filter 引起

我必须在 Intellij 启用以下选项

Add dependencies with "provided" scope to classpath

enter image description here

您将看到下面的选项启用,

enter image description here

或者

您可以将下面的属性添加到应用程序配置部分下的 .intellij/workspace.xml文件中。 <option name="INCLUDE_PROVIDED_SCOPE" value="true" />

例如:

  <component name="RunManager" selected="Application.DemoApp">
<configuration name="DemoApp" type="Application" factoryName="Application">
<option name="INCLUDE_PROVIDED_SCOPE" value="true" /> ```


2022解决方案

从雄猫 艺术品的专辑中删除 提供者

 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--   Here <scope>provided</scope  >-->
</dependency>