java.lang.ClassNotFoundException:org.glassfish.jersey.servlet.ServletContainer

时间:2014-10-18 21:34:42

标签: java eclipse web-services rest jersey

您可能会觉得这是一个重复的问题,但没有一个同名的问题可以解决我的问题。我使用Jersey 2.0在Eclipse中创建RESTful Web服务,我使用Tomcat 7.0作为我的服务器,我有以下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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <servlet>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.shop.domain</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

我有一个名为Hello的简单类:

@Path("customers")
public class Hello {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getCustomer() {
        return "hello";
    }
}

我有一个名为jersey的泽西岛图书馆:

enter image description here

每次我运行这个项目时,都会出现错误

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

有什么想法吗?

9 个答案:

答案 0 :(得分:5)

虽然以上所有内容都适用(Eclipse不是最可靠的应用程序),但请确保已仔细检查了maven依赖项。你应该注意,对于球衣2.19我必须添加这两个maven依赖:

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

答案 1 :(得分:3)

等等,你说你有一个名为jersey的泽西岛图书馆,你创建了一个User Library并将其命名为jersey吗?如果是这样,请尝试将您的泽西jar文件复制到 WebContent - &gt; WEB-INF - &gt; LIB 即可。

答案 2 :(得分:1)

我在Eclipse中遇到了这个问题。我的项目设置非常相似 - Jersey 2Tomcat 7。我正在从eclipse里面运行tomcat,而且似乎在eclipse的某个地方忘记了如何正确地将库部署到tomcat。

我尝试将我的war文件手动部署到tomcat并通过startup.sh启动它并且它工作正常,但是如果我通过eclipse启动它我获取我的web内容但是Jersey类不存在那么REST API不起作用。我的登录servlet运行正常,而不是泽西位。控制台有相同的错误:

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

启动时。所以它必然是eclipse如何将代码部署到tomcat的问题。我尝试进入eclipse服务器并清除工作目录,没有做任何事情。 (不是因为缺少课程)。

唯一有效的方法是在Eclipse中使用我的Servers配置并删除我的tomcat条目然后创建一个新的。我做到了,它立即修复了它。

答案 3 :(得分:1)

消息很简单,足以找出导致Jersey库不在类路径中的根本原因。

首先,您应该检查天气,是否在pom.xml中定义了球衣的依赖项。 如果不是,这里是您可以定义的依赖项。如果已在pom.xml中定义它,请忽略在pom.xml中添加依赖项

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

解决方案–在部署程序集中添加Jersey库

1。在项目资源管理器中右键单击您的项目

2。打开项目的部署程序集配置。

enter image description here

3。在程序集中添加构建路径jar文件,以便可以将它们添加到     最终war文件中的lib文件夹。

enter image description here

4。更新后的程序集将如下所示。

enter image description here

单击确定。 现在您可以出发了。

答案 4 :(得分:0)

我也在观察同样的问题。我正在使用tomcat8和Maven。如果我构建动态Web项目并手动添加所有库,项目工作正常,但如果我使用Maven,它会出现以下错误:

SEVERE: Servlet [Jersey REST Service] in web application [/EmployeeManagement] threw load() exception
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1313)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1164)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:120)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1095)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4914)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5201)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    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: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:744)

我在pom.xml文件中添加了以下maven依赖项:

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

答案 5 :(得分:0)

jersey jar 文件放在 WEB-INF / lib 中应该有效。

如果您无法将您的球衣jar文件放在 WEB-INF / lib 中,请尝试通过您的工作区手动复制粘贴并重新启动eclipse!这对我有用。

答案 6 :(得分:0)

对我来说,解决方法是这样做的:

Right click on Project -> Properties -> Java Build Path -> Libraries ->
Add Library... -> Server Runtime -> Apache Tomcat v7.0 -> Finish

我做的另一个步骤是在Maven中导入内容,但它不是必需的,因为没有它也可以正常运行。

但是,这是否有助于任何人

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2.1-b03</version>
        <scope>provided</scope>
    </dependency>

将servlet jar放入WEB-INF / lib只会使事情变得更复杂,因为异常消息变得更加复杂和无关紧要

编辑:哦,对你的Maven项目进行更新项目也有帮助。

答案 7 :(得分:0)

将Jersey库添加到库

下的构建路径

答案 8 :(得分:0)

我想补充一下,我遇到了同样的问题,@ Edin的答案也有效,但我使用的是 IntelliJ 。所以我想我会为Intellij添加一种方法(对于像我这样的未来人):

  1. 文件
  2. 项目结构
  3. 工件
  4. 你应该有一个以你的项目命名的神器,选择它
  5. 在右侧,您会看到一个列表 Available Elements
  6. 选择所有可用元素,右键单击,然后选择将其添加到 WEB-INF / Lib
  7. 的选项