2015-05-21 14 views
29

Uruchomiłem nowy projekt z Spring Boot 1.2.3. Dostaję błądSpring Boot java.lang.NoClassDefFoundError: javax/servlet/Filter

java.lang.NoClassDefFoundError: javax/servlet/Filter 

Gradle Zależności:

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

Oto pełna ślad stosu

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 

Odpowiedz

2

To wygląda jakbyś próbował dodać biblioteki servlet.jar lub servlet-api.jar do projektu /lib/ folder, ale Tomcat powinien już dostarczyć te biblioteki. Usuń je z projektu i ścieżki klas. Wyszukaj to w dowolnym miejscu w projekcie lub ścieżce klas i usuń je.

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

ten powinien być

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

Próbowałem to już, ale nadal pokazuje ten sam błąd – Ibrahim

91

dla użytkowników Maven komentarz zakresie określonym w poniższej zależności:

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

UPDATE

Jak feed.me wspomniano, że musisz odkomentować t podał część w zależności od rodzaju aplikacji, którą wdrażasz.

Oto przydatny związek ze szczegółami: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging

+9

Ważne jest, aby tę zależność „dostarczane” ponownie przed budową plik war! W przeciwnym razie plik wojenny ulegnie awarii po jego wdrożeniu (zdarzyło mi się to z tomcat). –

+1

Odkryłem również, że musiałem ponownie zaimportować projekt maven w intellij, prawdopodobnie w celu wymuszenia pobrania zależności bez tego dodatkowego zakresu, który powodował, że aplikacja wybrzmieć. – Opentuned

+1

To wszystko dobrze i dobrze, problem polega na tym, że kiedy budujesz wojnę, te słoiki są włączone i nie jest to możliwe. Dlaczego IntelliJ nie może znaleźć odpowiedniej ścieżki klas do uruchamiania aplikacji Gradle + Spring Boot? –

10

To ciekawe rzeczy z IDE (IntelliJ w tym przypadku):

  • jeśli pozostawić domyślne, czyli nie deklarujespring-boot-starter-tomcat pod pod warunkiem, spring-boot-maven-plugin (SBMP) umieścić słoiki tomcat na swoją wojnę -> i prawdopodobnie będziesz dostać błędy wdrażają tę wojnę do pojemnika (nie może być sprzeczne wersje)

  • indziej dostaniesz classpath z nie zależność kompilacji na tomcat-osadzić (SBMP zbuduje wojnę wykonywalny/słoika z świadczonych dużą liczbą wykazywanych zależności zawartych w każdym razie)

    • IntelliJ hornestly nie widzą pod warunkiem deps przy starcie (nie są w ścieżce klasy) po uruchomieniu jego konfigurację run SpringBoot .
    • i bez tomcat-osadzić nie można uruchomić wiosna-Boot z wbudowanego pojemnika serwletu.

Istnieją pewne obejście: umieścić słoików Tomcat do ścieżki klasy swój pomysł-modułu poprzez interfejs: File->Project Structure->(Libraries or Modules/Dependencies tab).

  • tomcat-osadzić-core
  • tomcat-osadzić-el
  • tomcat-osadzić-websocket
  • tomcat-osadzić-rejestracja-Juli

Maven ma mvn dependency:get polecenie, aby pobrać arbitralny słoiki do lokalnego repo. Gradle może mieć ten sam W przypadku maven. Zamiast dodawać zależności modułów w Idea, lepiej jest zadeklarować profil maven z zakresem kompilacji: spring-boot-starter-tomcat lib.

+1

Twoja aktualizacja rozwiązuje problem, ** ale ** kiedy tworzysz plik wojenny (arctifact produkcji) musisz pamiętać, że musisz aktywować profil. co nie jest automatycznie wykonywane dla ciebie. – eav

+0

Jeśli twój artefakt produkcyjny (PA) musi być z wbudowanym tomcat (ET) wewnątrz (w .war), nie jest konieczne zadeklarowanie _spring-boot-starter-tomcat_ jako zależności _provided_. Moja odpowiedź wyjaśnia przypadek, w którym potrzebujemy PA z ** no ** ET (ponieważ musiało to być wdrożone na samym kontenerze) i chcemy lokalnie uruchomić 'SpringBootApplication' ** z ** embed-tomcat w IntelliJ z uruchomionym konfiguracje. –

+1

Myślę, że aktualizacja jest poprawnym rozwiązaniem tego problemu, moim zdaniem: możesz zbudować wojnę bez wbudowanego Tomcat i możesz używać profilu wewnątrz IntelliJ. Bardzo elegancki i nie wymagający komentarza/komentarza – Peter

0

Konfiguracja here pracuje dla mnie:

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