wake-up-neo.net

ClassNotFoundException beim Starten von Tomcat

Ich versuche einen REST - Webdienst zu erstellen.

Mein Projekt sieht so aus:

enter image description here

Das Traceback ist:

8 déc. 2011 18:31:36 org.Apache.catalina.core.AprLifecycleListener init
INFO: The Apache Tomcat Native library which allows optimal performance in production     environments was not found on the Java.library.path: C:\Program Files\MyEclipse\Common\binary\com.Sun.Java.jdk.win32.x86_1.6.0.013\bin;C:\Program Files\MyEclipse\Common\plugins\com.genuitec.Eclipse.easie.Tomcat.myeclipse_9.0.0.me201109141806\Tomcat\bin
8 déc. 2011 18:31:36 org.Apache.coyote.http11.Http11Protocol init
INFO: Initialisation de Coyote HTTP/1.1 sur http-8080
8 déc. 2011 18:31:36 org.Apache.catalina.startup.Catalina load
INFO: Initialization processed in 394 ms
8 déc. 2011 18:31:37 org.Apache.catalina.core.StandardService start
INFO: Démarrage du service Catalina
8 déc. 2011 18:31:37 org.Apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.13
8 déc. 2011 18:31:37 org.Apache.catalina.startup.HostConfig deployWAR
INFO: Déploiement de l'archive Test-0.0.1-SNAPSHOT.war de l'application web
8 déc. 2011 18:31:37 org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Documents and Settings\Naya\Workspaces\MyEclipse 10\.metadata\.me_tcat\webapps\Test-0.0.1-SNAPSHOT\WEB-INF\lib\javax.servlet-3.0.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
8 déc. 2011 18:31:37 org.Apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Documents and Settings\Naya\Workspaces\MyEclipse 10\.metadata\.me_tcat\webapps\Test-0.0.1-SNAPSHOT\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
8 déc. 2011 18:31:38 org.Apache.catalina.core.ApplicationContext log
INFO: La servlet Test JAX-RS REST Servlet est marqué comme indisponible
8 déc. 2011 18:31:38 org.Apache.catalina.core.ApplicationContext log
Grave: Error loading WebappClassLoader
delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
[email protected]
 com.Sun.jersey.spi.container.servlet.ServletContainer
Java.lang.ClassNotFoundException: com.Sun.jersey.spi.container.servlet.ServletContainer
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1358)
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1204)
    at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1083)
    at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:981)
    at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:4042)
    at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:4348)
    at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:791)
    at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:771)
    at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:525)
    at org.Apache.catalina.startup.HostConfig.deployWAR(HostConfig.Java:825)
    at org.Apache.catalina.startup.HostConfig.deployWARs(HostConfig.Java:714)
    at org.Apache.catalina.startup.HostConfig.deployApps(HostConfig.Java:490)
    at org.Apache.catalina.startup.HostConfig.start(HostConfig.Java:1138)
    at org.Apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.Java:311)
    at org.Apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.Java:117)
    at org.Apache.catalina.core.ContainerBase.start(ContainerBase.Java:1053)
    at org.Apache.catalina.core.StandardHost.start(StandardHost.Java:719)
    at org.Apache.catalina.core.ContainerBase.start(ContainerBase.Java:1045)
    at org.Apache.catalina.core.StandardEngine.start(StandardEngine.Java:443)
    at org.Apache.catalina.core.StandardService.start(StandardService.Java:516)
    at org.Apache.catalina.core.StandardServer.start(StandardServer.Java:710)
    at org.Apache.catalina.startup.Catalina.start(Catalina.Java:566)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.Apache.catalina.startup.Bootstrap.start(Bootstrap.Java:288)
    at org.Apache.catalina.startup.Bootstrap.main(Bootstrap.Java:413)

Meine web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://Java.Sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee 
    http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name> 
  <servlet>
    <display-name>Test JAX-RS REST Servlet</display-name>
    <servlet-name>Test JAX-RS REST Servlet</servlet-name>
    <servlet-class>
        com.Sun.jersey.spi.container.servlet.ServletContainer
    </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Test JAX-RS REST Servlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Kann mir jemand helfen ?

24
Seb P

Ich bin auf das gleiche Problem gestoßen. Ich habe Version 1.12 verwendet.

Ich konnte die Klasse com.Sun.jersey.spi.container.servlet.ServletContainer nicht in den "jersey-server-1.12.jar" oder "jersey-core-1.12.jar" finden, wie in anderen Foren vorgeschlagen.

Sie können dies in Eclipse leicht überprüfen, wenn Sie es zum Build-Pfad hinzufügen und feststellen, dass Sie diese Klasse nicht in den oben genannten JAR-Dateien haben.

Ich habe herumgesucht und folgendes gefunden:

Die Klasse com.Sun.jersey.spi.container.servlet.ServletContainer befindet sich scheinbar in einer anderen JAR-Datei ("jersey-servlet-1.12.jar").

Ich habe dazu keine Dokumentation gefunden. Da diese Datei jedoch in meinem WEB-INF/lib enthalten ist, wurde dieses Problem behoben.

Hoffe das hilft.

32
Anjaneya Reddy

Lösung:

Fügen Sie die Abhängigkeit nur in pom.xml hinzu:

 <dependency>
      <groupId>com.Sun.jersey</groupId>
      <artifactId>jersey-servlet</artifactId>
      <version>1.13</version>
 </dependency>

Jetzt hat Ihre Anwendung die Klasse com.Sun.jersey.spi.container.servlet.ServletContainer

ps: Vergewissern Sie sich, dass die Bibliotheken an die Tomcat-Bereitstellung gesendet werden.

Überprüfen:  

Klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Eigenschaften -> Deployment Assembler Stellen Sie sicher, dass die Registerkarte SourceMaven Dependecies enthält. 

Andernfalls:

Klicken Sie auf die Schaltfläche Hinzufügen -> Java Build Path -> Maven Dependecies -> Finish.

Immer wenn Sie die Anwendung ausführen, werden alle Bibliotheken in die Bereitstellung importiert.

ps: Wenn das Maven-Projekt aktualisiert wird, müssen Sie diese Schritte erneut ausführen.

35
Diego

Wenn Sie mit Maven arbeiten, besteht das mögliche Problem möglicherweise darin, dass Ihre Gläser nicht auf Ihrem Tomcat bereitgestellt werden. Sie haben Ihre Maven-Abhängigkeiten im Java-Erstellungspfad (Projekt> Eigenschaften> Erstellungspfad), werden jedoch bei der Ausführung des Projekts auf Ihrem Tomcat von Eclipse Maven-Abhängigkeiten nicht für Tomcat bereitgestellt. Um dies zu lösen, müssen Sie: Rechtsklicken Sie auf> Eigenschaften und wählen Sie "Bereitstellungsassembly" aus. Fügen Sie Java Build Path-Einträge hinzu. Auf diese Weise sagen Sie dem WTP-Plugin (dem, auf dem Tomcat in Eclipse ausgeführt wird), dass es auch die Maven-Gläser kopieren soll enter image description here

18
luigi7up

In Jersey 2.0 wurde die Implementierung des Servlet-Containers geändert. Sie müssen org.glassfish.jersey.servlet.ServletContainer anstelle des alten com.Sun.jersey.spi.container.servlet.ServletContainer verwenden

Die Klasse ist in

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.0-m11</version>
    </dependency>

Sie können ein Skelettprojekt erstellen mit:

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeGroupId=org.glassfish.jersey.archetypes -
DinteractiveMode=false -DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example -DarchetypeVersion=2.0-m11
9
JasonPlutext

Sie müssen das Verzeichnis Jersey JAR in das Verzeichnis WEB-INF/lib einfügen, unabhängig davon, ob Sie Tomcat separat oder Eclipse ausführen.

Das hat bei mir funktioniert.

3
Anupam

Der Klassenlader kann die Klasse com.Sun.jersey.spi.container.servlet.ServletContainer nicht finden.

Sie müssen den Jersey JAR in Ihrem WEB-INF/lib-Verzeichnis ablegen.

Das könnte helfen:

http://www.suryasuravarapu.com/2009/02/rest-jersey-configuration-on-Tomcat.html

Jetzt habe ich mir das Bild angesehen, das Sie gepostet haben, und ich sehe Ihr Problem: Sie verwenden Eclipse und Maven, verstehen aber nicht wirklich, was sie tun.

Am Ende muss eine WAR-Datei im Tomcat-Verzeichnis /webapps vorhanden sein, die alle JARs von Drittanbietern enthält, die Sie im Verzeichnis WEB-INF/lib benötigen. Wenn nicht, findet Tomcat sie nicht.

Ich würde empfehlen, Ihr Problem zu vereinfachen. Erstellen Sie eine WAR-Datei von Hand. Lass Eclipse und Maven davon. Sobald es funktioniert hat, fügen Sie die Dinge hinzu, die Ihr Leben erleichtern sollen. Sie werden verstehen, was sie tun müssen, weil Sie es bereits ohne sie funktionieren lassen.

1
duffymo

der Beitrag von luigi7up arbeitete für mich. Ich verwende Tomcat 7.0.37, maven 3.1.1 und Jersey 1.17.1. Ich habe den Rechtsklick gemacht -> Eigenschaften -> Bereitstellungsassembly -> Klicken Sie auf Hinzufügen -> Java Build Path Entries -> ausgewählte Maven-Abhängigkeiten. Ich habe dann auf OK geklickt.

Als ich dies zum ersten Mal ausprobierte, bemerkte ich, dass ich nicht mehr die Fehlermeldung "Java.lang.ClassNotFoundException: com.Sun.jersey.spi.container.servlet.ServletContainer" erhalten habe, aber dann bemerkte ich, dass andere Klassen nicht gefunden wurden Nachrichten (leider habe ich nicht dokumentiert, welche Nachrichten dies waren). Ich habe folgende Trikotabhängigkeit verwendet:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.17.1</version>
</dependency>

Ich habe das herausgenommen und die folgenden Abhängigkeiten eingefügt:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.17.1</version>
</dependency>

Danach begannen die Dinge zu funktionieren. 

Hoffe das hilft jemandem!

1

Ich habe es dem WEB-INF/lib-Verzeichnis hinzugefügt, aber es funktionierte nicht, bis ich den lib-Ordner von Eclipse aktualisiert hatte und dann funktionierte.

0
Milind

von: http://jersey.Java.net/nonav/documentation/latest/chapter_deps.html#d4e1687

Die Bereitstellung einer Anwendung in einem Servlet-Container erfordert eine Bereitstellungsabhängigkeit mit diesem Container.

Informationen zur Konfiguration des Servlet-Containers finden Sie hier in der Java-Dokumentation.

Verwenden von Servlet: com.Sun.jersey.spi.container.servlet.ServletContainer erfordert eine Abhängigkeit vom Jersey-Servlet-Modul.

Maven-Entwickler, die servlet verwenden: com.Sun.jersey.server.impl.container.servlet.ServletAdaptor in einem Nicht-EE 5-Servlet, erfordern zusätzlich eine Abhängigkeit von dem Persistenz-API-Modul.

Nicht-Maven-Entwickler benötigen: persistence-api.jar

0
Leonid

Anjaneya Reddy, wie Sie gesagt haben, ist die Klasse nicht einmal in dem JAR, in dem sie sein soll. Was verwirrt mich, wo ist es und wo in der Dokumentation berührt es das?!?

Da jetzt alles so freundlich zu Maven ist, ist es schwierig, ein einfaches Tutorial auszuarbeiten, ohne sich darauf verlassen zu müssen. 

0
Half_Duplex

Offensichtlich sind fehlende Bibliotheken in Ihrem Implementierungsklassenpfad erforderlich.

Kopieren Sie die folgenden Jars in das Verzeichnis WEB-INF/lib

asm-3.1.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
jersey-client-1.15.jar
jersey-core-1.15.jar
jersey-json-1.15.jar
jersey-server-1.15.jar
jersey-servlet-1.15.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
0
bavan

Die folgende Abhängigkeit hilft:

<dependency>
  <groupId>com.Sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>1.8</version>
</dependency>

Siehe: http://www.mkyong.com/webservices/jax-rs/classnotfoundexception-com-Sun-jersey-spi-container-servlet-servletcontainer/

0