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

时间:2015-05-21 12:50:52

标签: spring-boot

我使用Spring Boot 1.2.3开始了一个新项目。我收到错误

java.lang.NoClassDefFoundError: javax/servlet/Filter

Gradle Dependencies:

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

8 个答案:

答案 0 :(得分:118)

对于maven用户, 评论以下依赖项中提供的范围:

    <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

答案 1 :(得分:29)

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

这应该是

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

答案 2 :(得分:16)

IDE的有趣之处(在这种情况下为IntelliJ):

  • 如果您保留默认值,即不要声明 spring-boot-starter-tomcat 提供 spring-boot-maven-plugin (SBMP)将tomcat的罐子放到你的战争中 - &gt;并且您可能会在将此战争部署到容器时出错(可能存在版本冲突)

  • 否则您将在 tomcat-embed 上获得无编译依赖的classpath(SBMP将使用提供的deps构建可执行war / jar 包括在内)

    • intelliJ在运行SpringBoot 运行配置时,在运行时没有看到提供的代码(它们不在类路径中)。
    • 并且没有tomcat-embed,您无法使用嵌入式servlet容器运行Spring-Boot。

有一些棘手的解决方法:通过UI将tomcat的jar放到你想法模块的类路径中:File->Project Structure->(Libraries or Modules/Dependencies tab)

  • Tomcat的嵌入芯
  • Tomcat的嵌入-EL
  • Tomcat的嵌入-的WebSocket
  • Tomcat的嵌入-测井巨力

maven案例

的更好解决方案

不要在Idea中添加模块依赖项,最好使用 spring-boot-starter-tomcat lib的编译范围声明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中激活此配置文件允许您使用嵌入式tomcat启动构建。

答案 3 :(得分:14)

更改应用程序依赖项的范围不是很好。将依赖项编译后,还将在将要安装的工件中提供依赖项。 最好的办法是通过specifying as stated in documentation来配置sping引导应用程序的RUN配置:

“包括“已提供”范围内的依赖项”“启用此选项 将具有Provided范围的依赖项添加到运行时类路径。”

enter image description here

答案 4 :(得分:2)

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

答案 5 :(得分:1)

配置here对我有用:

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"
}

答案 6 :(得分:1)

对于Jar

添加pom.xml

undefined

答案 7 :(得分:0)

添加以下依赖项。作用域应该被编译,然后它将起作用。

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