Seb P
Seb P

Reputation: 687

ClassNotFoundException when starting tomcat

I'm trying to make a REST web service.

My project looks like :

enter image description here

The traceback is :

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:
org.apache.catalina.loader.StandardClassLoader@19e8329
 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)

My 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>

Can anyone help me ?

Upvotes: 25

Views: 90096

Answers (12)

Anjaneya Reddy
Anjaneya Reddy

Reputation: 336

I have encountered the same issue. I was using Version 1.12.

I could not find the class com.sun.jersey.spi.container.servlet.ServletContainer in the "jersey-server-1.12.jar" or "jersey-core-1.12.jar" as suggested in some other forums.

You can easily check this in Eclipse, when you add it to the Build Path and notice that you do not have that class in the above mentioned jar files.

I searched around and found the following:

It looks like the class com.sun.jersey.spi.container.servlet.ServletContainer is in a different jar file ("jersey-servlet-1.12.jar").

I did not find any documentation about this. However having this file in my WEB-INF/lib resolved this issue.

Hope this helps.

Upvotes: 32

Stephen Spalding
Stephen Spalding

Reputation: 231

luigi7up's post above worked for me. I'm using tomcat 7.0.37, maven 3.1.1, and jersey 1.17.1. I did the right click -> properties -> Deployment Assembly -> Click Add -> Java Build Path Entries -> selected Maven Dependencies. I then clicked ok.

When I first tried this, I noticed that I no longer received the "java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer" error, but I then noticed that I was getting other 'class not found' messages (unfortunately, I didn't document what messages those were). I was using the following jersey dependency:

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

I took that out and put in the following dependencies:

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

Things began to work after that.

Hope this helps someone!

Upvotes: 1

Benny Code
Benny Code

Reputation: 54975

The following dependency helps:

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

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

Upvotes: 0

Diego
Diego

Reputation: 2731

Solution:

Only add the dependency in pom.xml:

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

Now your application will have the class com.sun.jersey.spi.container.servlet.ServletContainer

ps: Remember to check if the libraries are being sent to the tomcat deploy.

To check:

Right-click on your project -> Properties -> Deployment Assembler and make sure the Source tab contains Maven Dependecies.

Otherwise:

Click on button Add -> Java Build Path -> Maven Dependecies -> Finish.

Ready whenever you run the application all the libs will be imported in the deploy.

ps: Where the Maven project is updated, you must remake these steps.

Upvotes: 35

Leonid
Leonid

Reputation: 478

from: http://jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1687

Deploying an application on a servlet container requires a deployment dependency with that container.

See the Java documentation here on how to configure the servlet container.

Using servlet: com.sun.jersey.spi.container.servlet.ServletContainer requires a dependency on the jersey-servlet module.

Maven developers using servlet: com.sun.jersey.server.impl.container.servlet.ServletAdaptor in a non-EE 5 servlet require a dependency on the persistence-api module in addition.

Non-Maven developers require: persistence-api.jar

Upvotes: 0

JasonPlutext
JasonPlutext

Reputation: 15878

In Jersey 2.0, the servlet container implementation changed. You need to use org.glassfish.jersey.servlet.ServletContainer instead of the old com.sun.jersey.spi.container.servlet.ServletContainer

The class is in

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

You can create a skeletal project using:

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

Upvotes: 9

luigi7up
luigi7up

Reputation: 5962

If you're working with Maven then the possible issue might be that your jars don't get deployed to your Tomcat. So, you have your Maven Dependencies in the Java Build Path (Project > Properties > Build path), but when running the project on your Tomcat from Eclipse Maven Dependencies don't get deployed to TOmcat. To solve this you have to: right click > properties and select "Deployment Assembly". And add Java Build Path Entries. This way you're telling the WTP plugin (the one running Tomcat within Eclipse) that it should also copy the Maven's jars enter image description here

Upvotes: 18

bavan
bavan

Reputation: 1

You are apparently required missing libraries from your deployment classpath.

Copy the following jars in the WEB-INF/lib directory

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

Upvotes: 0

Milind
Milind

Reputation: 1

I added it to the WEB-INF/lib directory but it did not work until I refreshed the lib folder from Eclipse and then it started working.

Upvotes: 0

Half_Duplex
Half_Duplex

Reputation: 5234

Anjaneya Reddy, as you've pointed out, the class isn't even in the JAR it's supposed to be in. What baffles me, where is it and where in the documentation does it touch on this?!?

With everything being so Maven friendly now, it's difficult to bang out a simple tutorial without needing to depend on it.

Upvotes: 0

Anupam
Anupam

Reputation: 31

You need to put the Jersey JAR in your WEB-INF/lib directory, whether you are running Tomcat separately or running with Eclipse.

This worked for me.

Upvotes: 3

duffymo
duffymo

Reputation: 309008

The class loader can't find the class com.sun.jersey.spi.container.servlet.ServletContainer.

You need to put the Jersey JAR in your WEB-INF/lib directory.

This might help:

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

Now I've looked at the image you posted and I see your problem: You're using Eclipse and Maven, but you don't really understand what they're doing.

You have to end up with a WAR file in the Tomcat /webapps directory that has all the 3rd party JARs you need in the WEB-INF/lib directory. If you don't, Tomcat won't find them.

I'd recommend simplifying your problem. Create a WAR file by hand; leave Eclipse and Maven out of it. Once you've got it working, add in the things that are supposed to be making your life easier. You'll understand what they need to do, because you'll have already made it work without them.

Upvotes: 1

Related Questions