java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer
Posted
技术标签:
【中文标题】java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer【英文标题】:java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer 【发布时间】:2013-08-07 19:35:20 【问题描述】:我正在尝试使用 Jersey + Google 应用引擎构建一个简单的 hello world 应用程序两天。对于简单的 AppEngine 项目,我遵循了这些教程,并且都可以正常工作 https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform
但现在我正在尝试添加泽西岛并遵循本教程http://www.vogella.com/articles/REST/article.html。
但是服务器一直给我
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
当我在 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_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>TestServer</display-name>
<servlet>
<servlet-name>Jersey REST Service</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.test.myproject</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
我已经从 here 下载了 Jersey JAX-RS 2.1 RI bundle
,并按照教程中的说明在 WEB-INF/lib
文件夹中添加了所有 jar 文件。即使两天后也没有任何效果。我在谷歌上搜索了好几次,显然使用 Maven 的人已经以某种方式解决了这个问题,但我没有使用 Maven,编写该教程的人也没有。
只是为了检查导入的Jersey jars
中是否存在com.sun.jersey.spi.container.servlet.ServletContainer
我试图用Java 编写这个完全限定的名称并让智能感知完成名称但在com.sun.je
之后我无法获得任何智能感知所以我最后的猜测是在最新的 Jersey 版本中有一些 包重新排列,jersey
不再在 com.sun
中。我筋疲力尽,我将不胜感激任何帮助。
【问题讨论】:
你是如何安装 Jersey 的?我无法访问低于 2.29 版本的任何内容,并且文章谈到了 2.11? 【参考方案1】:这些可能是您的依赖项与版本混合,并确保将这些依赖项添加到 pom 文件中
<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>
之后右键单击您的 Eclipse 项目属性 -> 部署程序集 -> 添加 -> Java 构建路径条目 -> maven 依赖项 -> 完成。
现在检查一旦检查 Servlet 映射部分是否正确。
参考文献:RESTful Web Services with using Jersey
<servlet>
<servlet-name>RestServices</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.javaproficiency.jerseydemo.demo</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestServices</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
【讨论】:
【参考方案2】:这基本上取决于您使用的是哪个版本的球衣。如果您使用 Jersey ver.1.X.X,则需要添加
Jersey 1 使用“com.sun.jersey”,Jersey 2 使用 org.glassfish。在 servlet 类标签上。 另外请注意,以 com.sun.jersey 开头的 init-param 也不会被 Jersey 2 识别。
并将所有jar文件添加到WEB-INF lib文件夹中
【讨论】:
【参考方案3】:如果有人尝试使用 Jersey 构建一个 hello world 应用程序,我认为最简单的方法之一是遵循 Jersey 文档。
https://jersey.github.io/download.html
如果您已经在使用 maven,只需几分钟即可看到结果。
我在下面用过。
mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26
【讨论】:
【参考方案4】:同样的错误并浪费了 2 多个小时调试和尝试所有选项。我没有使用 Maven/POM,所以我无法利用少数人提供的解决方案。
最后通过以下方法解决:将jars直接添加到tomcat/lib(NOT WEB-INF\lib)文件夹并重启tomcat。
【讨论】:
【参考方案5】:在 pom.xml 文件中我们需要添加
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.8</version>
</dependency>
【讨论】:
【参考方案6】:这是 eclipse 设置问题,而不是 Jersey 问题。
来自这个线程 ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
右键单击你的 Eclipse 项目属性 -> 部署程序集 -> 添加 -> Java 构建路径条目 -> Gradle 依赖项 -> 完成。
所以当 Apache 启动时 Eclipse 没有使用 Gradle 依赖项。
【讨论】:
在这个问题上花了这么多时间,拯救了我的一天!【参考方案7】:回到原来的问题——java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
如前所述,在 JAX 2.x 版本中,ServletContainer 类已移至包 - org.glassfish.jersey.servlet.ServletContainer。相关的 jar 是 jersey-container-servlet-core.jar,它捆绑在 jaxrs-ri-2.2.1.zip
中JAX RS 可以在没有 mvn 的情况下通过手动将 zip 文件 jaxrs-ri-2.2.1.zip 中包含的所有 jar 复制到 WEB-INF/lib 文件夹(我使用过这个版本,适用于任何 2.x 版本)。将库复制到正确的文件夹使它们在运行时可用。
如果您使用 eclipse 来构建和部署您的项目,这是必需的。
【讨论】:
【参考方案8】:一个简单的解决方法是,检查 eclipse 的部署程序集中是否有依赖项或库。如果您使用的是 tomcat,服务器可能无法识别我们正在使用的库。在这种情况下,请在部署程序集中明确指定它。
【讨论】:
【参考方案9】:试试这个:
org.glassfish.jersey.servlet.ServletContainer
关于 servlet 类
【讨论】:
【参考方案10】:由于构建路径问题,我们收到此错误。您应该在 Build Path 中添加“Server Runtime”库。
"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"
请按照以下步骤解决找不到类的异常。
右键project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0
【讨论】:
【参考方案11】:您已下载 Jersey 2(JAX-RS 2 的 RI)。您所指的教程使用 Jersey 1。从 (here) 下载 Jersey 1.17.1,对您来说应该足够了。
Jersey 1 使用com.sun.jersey
,Jersey 2 使用org.glassfish.jersey
,因此例外。
另请注意,以 com.sun.jersey
开头的 init-param
也不会被 Jersey 2 识别。
编辑
Registering Resources and Providers in Jersey 2 包含有关如何在 Jersey 2 中注册类/实例的附加信息。
【讨论】:
+1。作为其他有类似问题的人的补充,阅读官方泽西用户指南会很有用:Chapter 4. Deploying a RESTful Web Service servlet-container 的新类是“org.glassfish.jersey.servlet.ServletContainer” servlet 类:org.glassfish.jersey.servlet.ServletContainer,初始化参数名称:jersey.config.server.provider.packages。 这个答案很好地解释了问题/错误的原因,但解决方案非常开放。因为,您提供的信息很少,我无法解决我的问题。 pom.xml、web.xml 和 java 文件的更多细节可以做得更好。或参考博客或文章,引导读者进入 Jersey 2.x 教程 @Siddharth 链接的文章应该展示一些解决问题的方法。如果您发现该文章中缺少某些信息,请告诉我。或者,您可以随时提供您的解决方案作为此问题的答案。【参考方案12】:你必须在你的 web.xml 中替换:
<servlet>
<servlet-name>Jersey REST Service</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.test.myproject</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
为此:
<servlet>
<servlet-name>Jersey REST Service</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.test.myproject</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
这是 Jersey 2.x 使用 org.glassfish.jersey 包而不是 com.sun.jersey(由 Jersey 1.x 使用),因此是例外。请注意,一旦您迁移到 JAX-RS 2.0 和 Jersey 2.x,Jersey 2.x 也不会识别以 com.sun.jersey 开头的 init-param
如果您在任何时候使用 maven,您的 pom.xml 将是这样的:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.X</version>
</dependency>
将 2.X 替换为您想要的版本,例如2.15
【讨论】:
【参考方案13】:我也遇到了类似的问题。通过查看以下链接中的步骤教程解决了问题。
http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/
主要需要注意的是球衣库应正确放置在 TOMCAT WEB-INF/lib 文件夹中。它是由上面链接中提到的 Eclipse 设置自动完成的。它将使用依赖的 JAR 文件创建一个 WAR 文件。否则,您将遇到 ClassNotFound Exception 的问题。apache-tomcat-7.0.56-windows-x64\apache -tomcat-7.0.56\webapps\JerseyJSONExample\WEB-INF\lib
“11/23/2014 12:06 AM 130,458 jersey-client-1.9.jar
11/23/2014 12:06 AM 458,739 jersey-core-1.9.jar
11/23/2014 12:06 AM 147,952 jersey-json-1.9.jar
11/23/2014 12:06 AM 713,089 jersey-server-1.9.jar" 4 个文件 1,450,238 字节
第二个教程解释了如何创建一个生成和使用 JSON 输出的 Web 服务。http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/
这两个链接都很好地说明了事情的运作方式并节省了大量时间。
【讨论】:
【参考方案14】:虽然我遵循了不同的指南,但我遇到了和你一样的问题:http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/
奇怪的是,在我使用的本指南中,我不应该对版本之间的兼容性(1.x 与 2.x)有任何问题,因为按照指南您在pom.xml
上使用球衣 1.8.x在web.xml
中,您指的是1.x 版本之前所说的类(com.sun.jersey.spi.container.servlet.ServletContainer
)。所以我可以推断这应该可以工作。
我的猜测是因为我使用的是 JDK 1.7 这个类已经不存在了。
之后,我尝试用我之前的答案解决,没有帮助,我对pom.xml
和web.xml
进行了更改,错误更改为:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
这应该是存在的!
由于这个错误,我找到了一个“新”解决方案:http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/
使用 Maven(原型),生成一个 jersey 项目,像这样:
mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.0
它对我有用! :)
【讨论】:
【参考方案15】:你需要将jersey-bundle-1.17.1.jar
添加到项目的lib中
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<!-- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> -->
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<!-- <param-name>jersey.config.server.provider.packages</param-name> -->
<param-value>package.package.test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
【讨论】:
【参考方案16】:虽然我使用的是 Jersey 1.x,但我今天遇到了同样的错误,并且我的类路径中有正确的 jar。对于那些想完全按照 vogella 教程并使用 1.x jar 的人,您需要将 jersey 库添加到 WEB-INF/lib 文件夹。这肯定会解决问题。
【讨论】:
我有同样的错误(使用 jersey-server、jersey-core、jersey-servlet 的 1.18.1 版本),但 IntelliJ Idea 创建的分解人工制品是带有类文件夹的单个 WEB-INF 文件夹里面和web.xml file.Classes文件夹只包含Hello.class【参考方案17】:如果您使用的是 jersey 2.x,那么您需要在 web.xml 中进行不同的配置,因为 servlet 类在其中发生了变化。您可以使用以下配置更新您的 web.xml。
<servlet>
<servlet-name>myrest</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>your.package.path</param-value>
</init-param>
<init-param>
<param-name>unit:WidgetPU</param-name>
<param-value>persistence/widget</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myrest</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
【讨论】:
你真的需要 unit:WidgetPU 吗?我认为可以通过删除它来简化答案。 此参数与 Jersey 无关在 pom 中添加这个
<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>
【讨论】:
jersey-core 是 jersey-server 的一个依赖项,很多不需要显式添加 好吧,发生在我们身上的是我们将 jersey-server 从 1.0.2 升级到 1.11,并且“ServletContainer”类突然 AWOL。看起来它已在该版本和未来版本中移至 jersey-servlet 包参考:developer.jboss.org/thread/221647?tstart=0以上是关于java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer的主要内容,如果未能解决你的问题,请参考以下文章