Подтвердить что ты не робот

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
4b9b3361

Ответ 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>