ClassNotFoundException when starting tomcat
Asked Answered
M

12

25

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 ?

Mede answered 9/12, 2011 at 10:24 Comment(0)
D
32

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.

Drag answered 5/6, 2012 at 18:48 Comment(1)
In version 1.16 I was using the class is only in jersey-bundle-1.16.jarWheelhouse
S
35

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.

Specialism answered 1/8, 2012 at 6:59 Comment(3)
Extra note.. Make sure the version you specify sync with the jersey-server artifactOast
I needed to complete the "Otherwise" section. Thank you!Amorette
For Jersey 2.0, it is groupId:org.glassfish.jersey.containers artifactId:jersey-container-servletYerkovich
D
32

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.

Drag answered 5/6, 2012 at 18:48 Comment(1)
In version 1.16 I was using the class is only in jersey-bundle-1.16.jarWheelhouse
A
18

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

Amaranthine answered 10/12, 2012 at 16:21 Comment(3)
Thanks a lot. This really solves the problem I've encountered when I used Maven dependency to build. I don't know why Maven dependency is not automatically added to Java Build Path by default in Eclipse.Allanallana
had no idea this helped someone... glad it didAmaranthine
Yep, helped me too. The weird this is that I did had those jars in the list added via the 'Folder' option on your screenshot and it didn't work, but once I added it via 'Java Build Path Entries' it finally worked. Thanks!Malaysia
S
9

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
Stumpy answered 11/1, 2013 at 7:48 Comment(2)
why do I need 'skeletal project'?Puiia
I just changed the Jersey 2.x to Jersey 1.x and this fix my problem (same as asker problem).Puiia
V
3

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.

Valene answered 24/4, 2012 at 7:33 Comment(1)
This worked for me too. Thanks. But why does a different location matter, when the build settings associate the jersey jars to the project?Shadoof
V
1

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.

Violaviolable answered 9/12, 2011 at 10:29 Comment(0)
F
1

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!

Foin answered 20/1, 2014 at 1:0 Comment(0)
P
0

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.

Predicate answered 9/4, 2012 at 17:34 Comment(0)
B
0

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.

Burdelle answered 25/9, 2012 at 19:5 Comment(0)
J
0

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
Jessiejessika answered 28/11, 2012 at 20:59 Comment(1)
The Jersey versions don't match those included by the JAX-RS libraries eclipse has already included.Unbound
M
0

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

Micamicaela answered 29/1, 2013 at 10:5 Comment(0)
R
0

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/

Repress answered 14/6, 2013 at 23:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.