【问题标题】:ServletContainer class not found Exception未找到 ServletContainer 类异常
【发布时间】:2016-10-01 01:40:19
【问题描述】:

我无法再编译我的 jersey 项目,并且出现以下异常:

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)

我在SO 上读到它可能是由我的 pom 引起的,但我不知道如何解决它。

这是我的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 部门

我正在使用 Tomcat 7

【问题讨论】:

    标签: java maven jersey


    【解决方案1】:

    以下是解决此类问题的方法。您缺少一个类,因此显然您的依赖项中需要这个类。您可以添加哪些包含缺少的类的依赖项?

    您可以搜索 GrepCodeMaven Central Repository 之类的资源来查找您的缺失课程(例如,这两个链接都在搜索这个缺失的课程)。

    现在我们知道缺少的依赖项是 com.sun.jersey:jersey-servlet,因此将其添加到您的依赖项中:

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

    作为建议,我注意到您的大多数 Jersey 依赖项都是 1.17.1 版本,但您有一个 1.19 版本……您可能应该尝试对所有这些依赖项都使用相同的版本以避免任何不一致他们之间。

    另外,如果这些库包含在您的应用程序服务器中(如 Glassfish 或 Weblogic 等),那么您应该在所有这些库上都有 &lt;scope&gt;provided&lt;/scope&gt;。但是,如果您使用的是 Tomcat 之类的东西,那么请忘记这一点(除非您手动将它们添加到 Tomcat 的 lib 目录中)。

    【讨论】:

    • 我的 pom 中已经有了这个 jersey-servlet 依赖项,我更改了不同的版本,我将更新我的 stackoverflow 问题,但仍然没有运气
    • @eeadev 你能显示你的部署文件夹吗?类和库。我们可以确定部署是否正确。
    • 你没有在上面的 POM 中提到这个依赖。我还是没看到。 (请注意jersey-servletjersey-server 不同。)
    【解决方案2】:

    您的 web.xml 中是否定义了 servlet 类?

    jersey 1.x 版本需要如下:

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

    确保不要将球衣 1.x 与 2.x 混用

    您的 pom.xml 中有几个库冲突

    • 您的 pom.xml 中有 2 个不同的 javax.servlet 依赖项。确保您拥有其中之一。 (我不确定,但我认为你也不需要添加这个,因为球衣会有它,检查并确认)
    • 此外,你有一个依赖javax.ws.rs-api,这与 jersey 因为 jersey 已经包含它。

    即使这些不能解决这个特定问题,也要删除这些冲突以避免进一步的问题。

    更多信息:link1 link2

    【讨论】:

      【解决方案3】:

      这是仅适用于 Jersey 1 的最小设置。与您的版本进行比较。

      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>
      

      添加您的存储库以提取这些 jar。

      【讨论】:

      • 这没有找到 jax-servlet 和 javax.ws.rs
      • jersey-bundle 包括什么?每个图书馆都有球衣*?
      • 它包含所有依赖库,然后您将包含 jersey 运行时库(核心、服务器和客户端(如果您使用 jersey 客户端)。该链接列出了它包含的所有库。
      • 我改了,但还是一样,请看我的更新
      猜你喜欢
      • 1970-01-01
      • 2013-04-09
      • 2016-09-13
      • 2015-08-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多