启动tomcat时ClassNotFoundException

时间:2011-12-09 10:24:17

标签: web-services rest tomcat jersey classnotfoundexception

我正在尝试制作REST网络服务。

我的项目如下:

enter image description here

追溯是:

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)

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

任何人都可以帮助我吗?

12 个答案:

答案 0 :(得分:35)

<强>解决方案:

仅在pom.xml中添加依赖项:

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

现在您的应用程序将包含类com.sun.jersey.spi.container.servlet.ServletContainer

ps:请记住检查库是否被发送到tomcat部署。

检查:

  

右键点击您的项目 - &gt;属性 - &gt;部署汇编程序   并确保 Source 标签包含 Maven Dependecies

,否则:

  

点击按钮添加 - &gt; Java构建路径 - &gt; Maven Dependecies - &gt;完成。

无论何时运行应用程序,都会在部署中导入所有库。

ps:在更新Maven项目的地方,您必须重新制作这些步骤。

答案 1 :(得分:32)

我遇到了同样的问题。我使用的是版本1.12。

我在其他一些论坛中建议的“jersey-server-1.12.jar”或“jersey-core-1.12.jar”中找不到班级com.sun.jersey.spi.container.servlet.ServletContainer

当您将它添加到Build Path并注意到上面提到的jar文件中没有该类时,您可以在Eclipse中轻松检查它。

我四处寻找并发现了以下内容:

看起来类com.sun.jersey.spi.container.servlet.ServletContainer位于不同的jar文件中(“jersey-servlet-1.12.jar”)。

我没有找到任何关于此的文档。但是,在我的WEB-INF / lib中使用此文件解决了这个问题。

希望这有帮助。

答案 2 :(得分:18)

如果您正在使用Maven ,那么可能的问题可能是您的jar没有部署到您的Tomcat。 因此,您在Java构建路径中具有Maven依赖项(项目&gt;属性&gt;构建路径),但是当从Eclipse Maven依赖项在Tomcat上运行项目时,不会将其部署到TOmcat。要解决此问题,您必须:右键单击&gt;属性并选择“部署程序集”。并添加Java Build Path Entries。这样你就可以告诉WTP插件(在Eclipse中运行Tomcat的插件),它也应该复制Maven的jar enter image description here

答案 3 :(得分:9)

在Jersey 2.0 中,servlet容器实现发生了变化。您需要使用 org.glassfish.jersey.servlet.ServletContainer 而不是旧的com.sun.jersey.spi.container.servlet.ServletContainer

班级在

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.0-m11</version>
    </dependency>

您可以使用以下方法创建骨架项目:

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

答案 4 :(得分:3)

无论是单独运行Tomcat还是使用Eclipse运行,都需要将 Jersey JAR放在 WEB-INF / lib 目录中。

这对我有用。

答案 5 :(得分:1)

类加载器找不到类com.sun.jersey.spi.container.servlet.ServletContainer

您需要将Jersey JAR放在WEB-INF/lib目录中。

这可能会有所帮助:

http://www.suryasuravarapu.com/2009/02/rest-jersey-configuration-on-tomcat.html

现在我看了你发布的图片,我看到了你的问题:你正在使用Eclipse和Maven,但你并不真正理解他们在做什么。

您必须在Tomcat /webapps目录中以WAR文件结束,该目录中包含WEB-INF/lib目录中所需的所有第三方JAR。如果不这样做,Tomcat将无法找到它们。

我建议您简化问题。手动创建WAR文件;让Eclipse和Maven离开它。一旦你有了它的工作,添加应该让你的生活更轻松的事情。你会明白他们需要做什么,因为没有他们你就已经让它成功了。

答案 6 :(得分:1)

luigi7up上面的帖子对我有用。我使用的是tomcat 7.0.37,maven 3.1.1和jersey 1.17.1。我点击了右键 - &gt;属性 - &gt;部署组件 - &gt;点击添加 - &gt; Java构建路径条目 - &gt;选择Maven依赖项。然后我点击确定。

当我第一次尝试这个时,我注意到我不再收到“java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer”错误,但我注意到我得到了其他的' class not found'消息(不幸的是,我没有记录那些消息)。我使用以下球衣依赖:

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

我把它拿出来放入以下依赖项:

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

之后事情开始奏效。

希望这有助于某人!

答案 7 :(得分:0)

我将它添加到WEB-INF/lib目录,但是直到我从Eclipse刷新了lib文件夹然后它开始工作它才能工作。

答案 8 :(得分:0)

Anjaneya Reddy,正如你所指出的那样,这个课程甚至都不在JAR中。它让我感到困惑,它在哪里以及它在文档的哪个地方触及了这个?!?

现在所有的Maven都非常友好,很难在不需要依赖它的情况下敲出一个简单的教程。

答案 9 :(得分:0)

您显然需要从部署类路径中删除库。

将以下jar复制到WEB-INF / lib目录

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

答案 10 :(得分:0)

来自:http://jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1687

在servlet容器上部署应用程序需要与该容器的部署依赖关系。

请参阅此处的Java文档,了解如何配置servlet容器。

使用servlet:com.sun.jersey.spi.container.servlet.ServletContainer需要依赖于jersey-servlet模块。

在非EE 5 servlet中使用servlet:com.sun.jersey.server.impl.container.servlet.ServletAdaptor的Maven开发人员需要依赖persistence-api模块。

非Maven开发人员需要:persistence-api.jar

答案 11 :(得分:0)

以下依赖项有助于:

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

请参阅:http://www.mkyong.com/webservices/jax-rs/classnotfoundexception-com-sun-jersey-spi-container-servlet-servletcontainer/