【问题标题】:Jersey ClassNotFoundException when contextInitialized上下文初始化时的 Jersey ClassNotFoundException
【发布时间】:2017-02-16 10:09:42
【问题描述】:

当我连接到选定的 servlet 时,它会抛出 ClassNotFoundException。我正在使用带有 Tomcat8 和 jersey RESTful 框架的 eclipse neon。有可能我在 web.xml 中有错误的 servlet conf 吗?

错误显示:

SEVERE: Allocate exception for servlet jersey
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1332)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166)
    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.allocate(StandardWrapper.java:828)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>org.CTAG.DATEX2REST</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>

  <display-name>CTAG DATEX2</display-name>

    <servlet>
        <servlet-name>jersey</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.CTAG.DATEX2REST</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey</servlet-name>
        <url-pattern>/rest</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>
            com.CTAG.application.Init
        </listener-class>
    </listener>
</web-app>

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>org.CTAG.DATEX2REST</groupId>
    <artifactId>org.CTAG.DATEX2REST</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>org.CTAG.DATEX2REST Maven Webapp</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>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.9</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>org.CTAG.DATEX2REST</finalName>
        <sourceDirectory>src/main/java</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                    <failOnMissingWebXml>true</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

【问题讨论】:

  • 如果我的回答对你有用,请告诉我。

标签: java maven servlets jersey tomcat8


【解决方案1】:

您的web.xml 内容不正确,它与Jersey 2.x 匹配,而您显然使用Jersey 1.x,确实包名称在Jersey 1.x 中以com.sun.jersey 开头,而在Jersey 2.x 中它们以org.glassfish.jersey 开头。

如果是Jersey 1.x.,请检查here web.xml 的内容。

<servlet>
    <servlet-name>jersey</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>org.CTAG.DATEX2REST</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>/rest</url-pattern>
</servlet-mapping>

或切换到Jersey 2.x

【讨论】:

    【解决方案2】:

    修复依赖关系

    您正在混合 Jersey 1.x (com.sun.jersey) 和 Jersey 2.x (org.glassfish.jersey)。

    我知道你不想使用 Jersey 2.x,所以删除:

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

    然后添加到您的pom.xml

    <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.23.2</version>
    </dependency>
    

    在 Servlet 2.x 容器(如 Tomcat 6)中部署

    Jersey 与任何至少支持 Servlet 2.5 规范的 Servlet 容器集成。对于这些环境,您必须在 Web 应用程序的 web.xml 部署描述符文件中显式声明 Jersey 容器 servlet:

    <web-app>
    
        <servlet>
            <servlet-name>MyApplication</servlet-name>
            <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
            <init-param>
                ...
            </init-param>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>MyApplication</servlet-name>
            <url-pattern>/api/*</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    &lt;init-param&gt; 元素的内容将根据您决定配置 Jersey 资源的方式而有所不同。

    在 Servlet 3.x 容器中部署(如 Tomcat 7 及更高版本)

    在 Servlet 3.0 容器中,您只需要实现一个自定义的 Application / ResourceConfig 子类。对于简单的部署,根本不需要web.xml。相反,@ApplicationPath 注释可用于注释自定义 Application / ResourceConfig 子类,并为应用程序中配置的所有 JAX-RS 资源定义基本应用程序 URI:

    @ApplicationPath("api")
    public class MyApplication extends ResourceConfig {
    
        public MyApplication() {
            packages("org.foo.rest;org.bar.rest");
        }
    }
    

    有关其他部署选项,请查看documentation

    【讨论】:

    • 卡西欧,很抱歉我迟到的反馈,我全神贯注学习球衣,我没有意识到给你写信。确实,您的回答解决了我的问题,但是现在,我处理了这样一个事实,即由于 URL 总是抛出 404,因此一般的球衣没有运行。
    • 谢谢 Cassio,我已经解决了通过 ResorceConfig.register() 更改 ResourceConfig.packages() 的问题
    • 但我不明白为什么
    • @datex2 我不确定。我认为这取决于您要注册的内容 :) 很高兴知道您已对其进行了排序。
    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多