3

I cannot compile my jersey project anymore and I get the following exception:

GRAVE: Servlet /Project-API threw load() exception
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1713)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:527)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:509)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:137)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5033)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5317)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

I read on SO that it might be caused by my pom but I cannot figure out how to fix it.

Here is my pom

 ...
<dependencies>

 <!-- http://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.3</version>
</dependency>

 <!-- http://mvnrepository.com/artifact/com.sun.jersey/jersey-server -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.19.1</version>
</dependency>
<!-- http://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.19.1</version>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.19.1</version>
</dependency>

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

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.19.1</version>
</dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.19</version>
    </dependency>

 <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-multipart</artifactId>
        <version>1.19.1</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.15</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.0</version>
    </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
      </dependency>

    <dependency> 
        <groupId>org.expressme</groupId> 
        <artifactId>JOpenId</artifactId> 
        <version>1.08</version> 
    </dependency>

    <dependency> 
        <groupId>org.openid4java</groupId> 
        <artifactId>openid4java</artifactId> 
        <version>1.0.0</version> 
    </dependency>

    <dependency>
        <groupId>oauth.signpost</groupId>
        <artifactId>signpost-core</artifactId>
        <version>1.2.1.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.2</version>
    </dependency>
</dependencies>

web.xml

...
  <servlet>
    <servlet-name>jersey-serlvet</servlet-name>
    <servlet-class>
                     com.sun.jersey.spi.container.servlet.ServletContainer
        </servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>...</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

...

maven dep.

enter image description here

I am using Tomcat 7

Community
  • 1
  • 1
eeadev
  • 3,662
  • 8
  • 47
  • 100

3 Answers3

2

Here's how you solve this sort of problem. You are missing a class, so obviously you need this class in your dependencies. What dependency can you add that contains the missing class?

You can search resources like GrepCode or the Maven Central Repository for your missing class (both those links search for this missing class, by way of example).

Now we know that the missing dependency is com.sun.jersey:jersey-servlet so add this to your dependencies:

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

By way of a suggestion, I notice that most of your Jersey dependencies are version 1.17.1 but you have one 1.19 in there ... you should probably try to stick to the same version for all of them to avoid any inconsistencies between them.

Also, if these libraries are included in your application server (like Glassfish or Weblogic, etc) then you should have <scope>provided</scope> on all of them. But if you're using something like Tomcat, then forget this (unless you're manually adding them to Tomcat's lib directory).

dcsohl
  • 7,186
  • 1
  • 26
  • 44
  • I already have this jersey-servlet dependency in my pom, I changed the different version and I will update my stackoverflow question but still no luck – eeadev Jun 06 '16 at 07:26
  • @eeadev can you show your deployment folder ? the classes and the libraries. we can make sure if things are deployed correctly. – s7vr Jun 06 '16 at 08:17
  • You didn't mention this dependency in the POM above. I still don't see it. (And do note that `jersey-servlet` is not the same as `jersey-server`.) – dcsohl Jun 06 '16 at 14:56
2

Here is the minimal set up that just works for Jersey 1. Compare with your version.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="http://java.sun.com/xml/ns/javaee"      xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">
<display-name>Rest-Jersey1</display-name>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>

pom.xml

<groupId>Jersey_Maven_App</groupId>
<artifactId>com.jersey.app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<properties>
<jdk.version>1.8</jdk.version>
<jersey.version>1.19.1</jersey.version>
</properties>

<dependencies>
    <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>${jersey.version}</version>
    </dependency>
    <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>${jersey.version}</version>
    </dependency>
    <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>${jersey.version}</version>
    </dependency>
    <dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>20041228.180559</version>
    </dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
    <source>${jdk.version}</source>
    <target>${jdk.version}</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>

Add your repository to pull these jars.

s7vr
  • 73,656
  • 11
  • 106
  • 127
  • this doesnt find jax-servlet nor javax.ws.rs – eeadev Jun 06 '16 at 08:47
  • 1
    it's all in there inside bundle jar http://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle/1.19.1 – s7vr Jun 06 '16 at 08:48
  • what does jersey-bundle include? every library with jersey*? – eeadev Jun 06 '16 at 09:39
  • It includes all the dependent libraries and then you'll to include jersey run time libraries ( core, server and client( if you use jersey client). The link lists all the libraries that it includes. – s7vr Jun 06 '16 at 09:42
  • I changed it but I am getting the same, please see my updates – eeadev Jun 06 '16 at 10:34
  • what server are you using ? Can you share your libraries as you see under deployment folder ? Remove the jars that you don't need. Keep it simple for now until it works. – s7vr Jun 06 '16 at 10:44
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/113908/discussion-between-eeadev-and-shiv-v). – eeadev Jun 06 '16 at 10:49
1

Do you have the servlet class defined in your web.xml?

It needs to be as follows for jersey 1.x versions:

<servlet>  
    <servlet-class>
        com.sun.jersey.spi.container.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.sample.rest</param-value>
    </init-param>
</servlet>

Make sure you don't mix jersey 1.x with 2.x

You have a couple of library collisions in your pom.xml

  • You have 2 different javax.servlet dependencies in your pom. Make sure you have one of them. (I'm not sure but I don't think you need to add this either as jersey would have it, check and confirm)
  • Further, you have a dependency javax.ws.rs-api, this conflicts with jersey as jersey already includes it.

Even if these don't fix this particular problem, remove these collisions to avoid further issues.

for more information: link1 link2

Community
  • 1
  • 1
Hazim
  • 1,405
  • 1
  • 11
  • 24