我使用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
答案 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 包括在内)
有一些棘手的解决方法:通过UI将tomcat的jar放到你想法模块的类路径中:File->Project Structure->(Libraries or Modules/Dependencies tab)
。
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范围的依赖项添加到运行时类路径。”
答案 4 :(得分:2)
看起来您试图将库servlet.jar
或servlet-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>