Sajeetharan
Sajeetharan

Reputation: 222657

java.lang.ClassNotFoundException with JAX-RS and Maven

I assume it's a duplicate question, but I could not find a solution. I have developed a JAX-RS service with Maven.

Here is my pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.diginreportengine.jersey</groupId>
    <artifactId>digin-report</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>DiginReportEngine</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
            <scope>provided</scope>
        </dependency>
         <build>
        <finalName>Report</finalName>
    </build>

</project>

web.xml:

<web-app 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"
                        version="3.0">    
    <display-name>DigIn Report Engine</display-name> 
    <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>com.diginreportengine.jersey.main</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet> 
    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rs/*</url-pattern>
    </servlet-mapping> 
</web-app>

and the Code:

@Path("GetReport")
public class ReportService { 
    @GET
    @Path("{reportName}/{parameters}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response getReport(@PathParam("reportName") String reportName,@PathParam("parameters") String parameters) {

    }

    @GET
    @Path("{reportName}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response startEngine(@PathParam("reportName") String command) {
            return Response.status(200).entity("ok").build();
    }
}

log:

INFO: Loaded APR based Apache Tomcat Native library 1.2.5 using APR version 1.5.1.
Mar 31, 2016 1:17:37 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
Mar 31, 2016 1:17:38 PM org.apache.catalina.core.AprLifecycleListener initializeSSL
INFO: OpenSSL successfully initialized (OpenSSL 1.0.2g  1 Mar 2016)
Mar 31, 2016 1:17:38 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-apr-8085"]
Mar 31, 2016 1:17:38 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-apr-8009"]
Mar 31, 2016 1:17:38 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2121 ms
Mar 31, 2016 1:17:38 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Mar 31, 2016 1:17:38 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.32
Mar 31, 2016 1:17:41 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Mar 31, 2016 1:17:41 PM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [234] milliseconds.
Mar 31, 2016 1:17:44 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Mar 31, 2016 1:17:44 PM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet jersey-serlvet as unavailable
Mar 31, 2016 1:17:44 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet [jersey-serlvet] in web application [/DiginReport] threw load() exception
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1308)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1142)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:518)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:499)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1102)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1038)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4997)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5289)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Mar 31, 2016 1:17:44 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8085"]
Mar 31, 2016 1:17:44 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-apr-8009"]
Mar 31, 2016 1:17:44 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 5357 ms

Upvotes: 0

Views: 5138

Answers (1)

cassiomolin
cassiomolin

Reputation: 131237

Your configuration is messy: You added the JAX-RS 2.0 dependency, but you are using Jersey 1.x configuration in your web.xml deployment descriptor.

I think you want to use Jersey 2.x, which is the reference implementation for the JAX-RS 2.0 specification.

A quick overview

Jersey 1.x and Jersey 2.x use different package names:

  • Jersey 1.x: com.sun.jersey
  • Jersey 2.x: org.glassfish.jersey

Jersey 1.x and Jersey 2.x implement different versions of the JAX-RS specification:

Fixing your dependencies

Change dependencies in your pom.xml to be as following:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <!-- if your container implements Servlet API older than 3.0, 
             use "jersey-container-servlet-core"  -->
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.22.2</version>
    </dependency>
</dependencies>

For more details on Jersey modules and dependencies, have a look at the documentation.

Fixing your deployment descriptor

You are using Tomcat 8.x, which supports Servlet API 3.1. For simple deployments, no web.xml deployment descriptor is necessary at all.

If you want, you can have an empty one, as following:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

 </web-app>

However, you'll need a custom Application/ResourceConfig subclass annotated with @ApplicationPath to define the base application URI for all Jersey resources configured in the application:

@ApplicationPath("rs")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        packages("com.diginreportengine.jersey.main");
    }
}

In case you are not providing web.xml deployment descriptor for your Maven based web application project, you need to configure your maven-war-plugin to ignore the missing web.xml file by setting failOnMissingWebXml configuration property to false in your project pom.xml file:

<plugins>
    ...
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
    </plugin>
    ...
</plugins>

For more details on Jersey deployment and runtime environments, have a look at the documentation.

Upvotes: 1

Related Questions