java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer相关的知识,希望对你有一定的参考价值。
我正在尝试使用Jersey + Google应用引擎构建一个简单的hello world应用程序两天。对于简单的AppEngine项目,我遵循这些教程,两者都很好用https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform
但现在我正在尝试添加Jersey并遵循本教程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>
我从JAX-RS 2.1 RI bundle
下载了Jersey here,并在WEB-INF/lib
文件夹中添加了所有jar文件,如教程中所述。即使两天后也没有任何效果。我已经在Google上搜索了几次,显然使用Maven的人已经解决了它,但我没有使用Maven也没有写过那个教程的人。
只是为了检查在导入的com.sun.jersey.spi.container.servlet.ServletContainer
中是否存在Jersey jars
我试着用Java编写这个完全限定的名称并让intellisense完成名称,但是在com.sun.je
之后我无法获得任何intellisense所以我的最后一个猜测是有一些包重新排列最新泽西版本和jersey
不再在com.sun
内。我很累,我很感激任何帮助。
你已经下载了Jersey 2(JAX-RS 2的RI)。您所指的教程使用Jersey 1.从(here)下载Jersey 1.17.1,应该足够了。
泽西1使用com.sun.jersey
,泽西2使用org.glassfish.jersey
因此例外。
另请注意,从init-param
开始的com.sun.jersey
也不会被Jersey 2认出。
Edit
Registering Resources and Providers in Jersey 2包含有关如何在Jersey 2中注册类/实例的其他信息。
你需要将project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0
添加到项目的lib中
jersey-bundle-1.17.1.jar
您必须在web.xml中替换:
<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>
为了这:
<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>
这是Jersey 2.x使用org.glassfish.jersey包而不是com.sun.jersey(由Jersey 1.x使用),因此是例外。请注意,一旦迁移到JAX-RS 2.0和Jersey 2.x,泽西2.x将无法识别以com.sun.jersey开头的init-param。
如果你在任何时候使用maven,你的pom.xml将是这样的:
<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>
将2.X替换为您想要的版本,例如2.15
一个简单的解决方法是,检查eclipse的部署程序集中是否有依赖项或库。如果您使用的是tomcat,则服务器可能没有识别出我们正在使用的库。在这种情况下,在部署程序集中明确指定它。
回到原来的问题 - 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,捆绑在<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.X</version>
</dependency>
中
JAX RS可以在没有mvn的情况下通过手动复制zip文件jaxrs-ri-2.2.1.zip中包含的所有jar(我使用过这个版本,可以使用任何2.x版本)到WEB-INF / lib文件夹来解决。将libs复制到右侧文件夹使它们在运行时可用。
如果您使用eclipse构建和部署项目,则需要这样做。
在pom.xml文件中我们需要添加
jaxrs-ri-2.2.1.zip
同样的错误,浪费了2个多小时的调试和尝试所有选项。我没有使用Maven / POM,所以我无法利用少数人给出的解决方案。
最后,下面解决了这个问题:将jar直接添加到tomcat / lib(NOT WEB-INF lib)文件夹并重新启动tomcat。
如果有人试图使用Jersey构建一个hello world应用程序,我认为最简单的方法之一就是遵循Jersey文档。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.8</version>
</dependency>
如果您已经在使用maven,则只需几分钟即可看到结果。
我在下面用过。
https://jersey.github.io/download.html
它主要取决于您使用的是哪种版本的球衣。如果您使用的是Jersey ver.1.X.X,则需要添加
Jersey 1使用“com.sun.jersey”,Jersey 2使用org.glassfish。在servlet类标记上。另请注意,泽西2也不会识别以com.sun.jersey开头的init-param。
并将所有jar文件添加到WEB-INF lib文件夹中
如果你使用的是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>
在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>
这是一个日食设置问题,而不是泽西岛问题。
从这个线程ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer
右键单击您的eclipse项目Properties - > Deployment Assembly - > Add - > Java Build Path Entries - > Gradle Dependencies - > Finish。
所以Eclipse在Apache启动时没有使用Gradle依赖项。
试试这个 :
org.glassfish.jersey.servlet.ServletContainer
在servlet类上
虽然我遵循了不同的指南,但我遇到了和你一样的问题:http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/
奇怪的是,在我使用的本指南中,我不应该对版本之间的兼容性(1.x对2.x)有任何问题,因为按照指南你在pom.xml
you中使用jazxswpoiand上的jersey 1.8.x参考如1.x版之前所述的类(web.xml
)。所以我可以推断这应该是有效的。
我的猜测是因为我正在使用JDK 1.7这个类不再存在了。
之后,我尝试用我的答案解决我的问题,没有帮助,我在com.sun.jersey.spi.container.servlet.ServletContainer
上对pom.xml
and进行了更改,错误更改为:web.xml
据说应该存在!
由于这个错误,我找到了一个“新的”解决方案:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
使用Maven(原型),生成一个球衣项目,喜欢这样:
以上是关于java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer的主要内容,如果未能解决你的问题,请参考以下文章