2015-05-21 12 views
29

Ich begann ein neues Projekt mit Spring Boot 1.2.3. Ich erhalte FehlerSpring Boot java.lang.NoClassDefFoundError: javax/servlet/Filter

java.lang.NoClassDefFoundError: javax/servlet/Filter 

Gradle Abhängigkeiten:

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

Hier ist der vollständige Stack-Trace

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 

Antwort

2

Das sieht aus wie Sie versuchen, die Bibliotheken servlet.jar oder servlet-api.jar in einem Projekt hinzuzufügen /lib/ Ordner, aber Tomcat sollte Sie bereits mit diesen Bibliotheken versorgen. Entferne sie aus deinem Projekt und Klassenpfad. Suchen Sie an einer beliebigen Stelle in Ihrem Projekt oder Klassenpfad und entfernen Sie sie.

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

Dies sollte

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

ich dies bereits versucht, aber immer noch denselben Fehler zeigt – Ibrahim

91

für den Maven-Benutzer sein, Kommentar des in der folgenden Abhängigkeit bereitgestellt -umfang:

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

UPDATE

Als feed.me erwähnt, dass Sie t auskommentieren müssen Je nachdem, welche Art von App Sie einsetzen, stellt er einen Teil zur Verfügung. Hier

ist eine nützliche Verbindung mit den Details: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging

+9

Es ist wichtig, diese Abhängigkeit „zur Verfügung gestellt“ wieder zu machen, bevor Sie eine WAR-Datei bauen! Sonst stürzt die WAR-Datei beim Deployment ab (passiert mir mit Tomcat) –

+1

Ich fand auch, dass ich das maven-Projekt in intellij erneut importieren musste, um die Abhängigkeit zu erzwingen, ohne dass dieser zusätzliche Bereich heruntergeladen wurde, der die Anwendung verursachte prang aus. – Opentuned

+1

Das ist alles gut und gut, das Problem ist, dass wenn Sie dann den Krieg bauen diese Gläser enthalten sind und das ist keine Option. Warum kann IntelliJ nicht den richtigen Klassenpfad zum Ausführen einer Gradle + Spring Boot-Anwendung ermitteln? –

10

Es ist interessant, die Dinge mit IDE (IntelliJ in diesem Fall):

  • wenn Sie den Standard verlassen, dh nicht erklärenspring-boot-starter-tomcat als bereitgestellt, ein spring-boot-maven-plugin (SBMP) setzen Tomcat Gläser zu Ihrem Krieg -> und Sie werden wahrscheinlich erhalten Fehler, diesen Krieg zu Containern bereitstellen (es gibt eine Version Konflikt sein könnten)

  • sonst werden Sie Classpath mit keine Kompilierung Abhängigkeit auf tomcat-einbetten (SBMP bauen bekommen ausführbaren Krieg/jar mit versehen deps enthalten sowieso)

    • IntelliJ hornestly nicht bereitgestellt deps zur Laufzeit sieht (sie sind nicht in classpath sind), wenn Sie seine SpringBoot Lauf Konfiguration laufen.
    • und ohne Kater-betten Sie können nicht Frühling-Boot mit eingebetteten Servlet-Container ausgeführt werden.

Es gibt einige Abhilfe: Tomcats Gläser zu Classpath Ihrer Idee-Modul via UI setzen: File->Project Structure->(Libraries or Modules/Dependencies tab).

  • tomcat-embed-Core
  • tomcat-embed-el
  • tomcat-embed-websocket
  • tomcat-embed-logging-juli

Maven hat mvn dependency:get Befehl willkürlich herunterladen Gläser zum lokalen Repo. Gradle könnte das gleiche haben

UPD. Für maven Fall. Anstatt Modulabhängigkeiten in Idea hinzuzufügen, ist es besser, maven profile mit dem Kompilierbereich spring-boot-starter-tomcat zu deklarieren.

+1

Ihr Update behebt das Problem, ** aber ** Wenn Sie eine WAR-Datei (Produktionsartifakt) erstellen, müssen Sie daran denken, dass Sie das Profil aktivieren müssen. was nicht automatisch für dich erledigt wird. – eav

+0

Wenn Ihr Produktionsartefakt (PA) mit eingebettetem tomcat (ET) innerhalb (in .war) sein muss, muss _spring-boot-starter-tomcat_ nicht als _provided_abhängigkeit deklariert werden. Meine Antwort erklärt den Fall, wenn wir PA mit ** no ** ET benötigen (da es auf einem Container selbst deployed werden musste) und "SpringBootApplication" ** mit ** embed-tomcat in IntelliJ mit seinem Run lokal starten wollen. Konfigurationen. –

+1

Ich denke, das Update ist meiner Meinung nach die richtige Lösung für dieses Problem: Sie können den Krieg ohne eingebettete Tomcat erstellen und das Profil in IntelliJ verwenden. Sehr elegant und kein Kommentar/Kommentar erforderlich – Peter

0

Die Konfiguration here arbeitet für mich:

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