Spring Загрузите java.lang.NoClassDefFoundError: javax/servlet/Filter
Я начал новый проект с Spring Boot 1.2.3. Я получаю сообщение об ошибке
java.lang.NoClassDefFoundError: javax/servlet/Filter
Gradle Зависимости:
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
Ответы
Ответ 1
для пользователей maven,
комментируйте область действия, указанную в следующей зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
UPDATE
Как указано в файле feed.me, вы должны раскомментировать предоставленную часть в зависимости от того, какое приложение вы развертываете.
Вот полезная ссылка с подробностями:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging
Ответ 2
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
Это должно быть
compile("org.springframework.boot:spring-boot-starter-tomcat")
Ответ 3
Это интересные вещи с IDE (IntelliJ в данном случае):
-
если вы оставите default, то есть не объявляете spring-boot-starter-tomcat как предоставленное, то spring-boot-maven-plugin (SBMP) добавит в вашу войну jar файлы tomcat → и вы, вероятно, получите ошибки при развертывании этой войны в контейнер (может быть конфликт версий)
-
иначе вы получите classpath без зависимости компиляции от tomcat-embed (SBMP создаст исполняемый файл war/jar с предоставленными deps в любом случае)
-
- IntelliJ не видит предоставленные deps во время выполнения (они не в classpath), когда вы запускаете конфигурацию запуска SpringBoot.
-
- и без встраивания tomcat вы не сможете запустить Spring-Boot со встроенным контейнером сервлета.
Существует несколько хитрых обходных путей: поместите фляги tomcat в путь к классам вашего File->Project Structure->(Libraries or Modules/Dependencies tab)
модуля через пользовательский интерфейс: File->Project Structure->(Libraries or Modules/Dependencies tab)
.
- кот-встраивать-жильный
- кот-встраивать-эль
- кот-встраивать-WebSocket
- кот-встраивать каротаж-Juli
Лучшее решение для случая maven
Вместо добавления зависимостей модуля в Idea, лучше объявить профиль maven с областью компиляции lib-boot-starter-tomcat lib.
<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.
Ответ 4
Похоже, вы пытались добавить библиотеки servlet.jar
или servlet-api.jar
в папку проекта /lib/
, но Tomcat уже должен предоставить вам эти библиотеки. Удалите их из своего проекта и класса. Найдите это в любом месте проекта или пути к классам и удалите его.
Ответ 5
Конфигурация здесь работает для меня:
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
Добавьте следующую зависимость. Область действия должна быть скомпилирована, тогда она будет работать.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>