java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer
我正在尝试使用Jersey + Google应用程序引擎构build一个简单的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>
我已经从这里下载了Jersey JAX-RS 2.1 RI bundle
,并按照教程中的描述在WEB-INF/lib
文件夹中添加了所有jar文件。 甚至在两天之后,没有任何工作。 我在Google上search了几次,显然使用Maven的人已经以某种方式解决了这个问题,但是我没有使用Maven,也没有编写这个教程。
只是为了检查,即使com.sun.jersey.spi.container.servlet.ServletContainer
存在于导入的Jersey jars
我试图用Java编写这个完全合格的名字,让intellisense完成名称,但是我不能在com.sun.je
之后得到任何intellisense com.sun.je
所以我最后的猜测是,在最近的Jersey版本中已经有一些软件包重新排列 ,并且jersey
不再在com.sun
。 我筋疲力尽,我将不胜感激任何forms的帮助。
您已经下载了Jersey 2(JAX-RS 2的RI)。 你所指的教程使用泽西1.从( 这里 )下载Jersey 1.17.1,应该足够你。
Jersey 1使用com.sun.jersey
,Jersey 2使用org.glassfish.jersey
因此是例外。
另外请注意,Jersey 2也不会识别以com.sun.jersey
开头的init-param
。
编辑
在Jersey 2注册资源和提供者包含了关于如何注册Jersey 2中的类/实例的更多信息。
如果你使用的是jersey2.x,那么你需要在web.xml中进行不同的configuration,因为servlet类是在其中改变的。 您可以使用以下configuration更新您的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),因为遵循指南你使用jersey1.8.x上pom.xml
和web.xml
引用一个类( com.sun.jersey.spi.container.servlet.ServletContainer
),如前所述1.x版本。 所以我可以推断这应该是工作。
我的猜测是因为我使用的JDK 1.7这个类不存在了。
之后,我试着用我之前的答案解决,没有帮助,我对pom.xml
和web.xml
了更改,错误更改为: java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
这应该是存在的!
由于这个错误,我发现了一个“新的”解决scheme: 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
它为我工作! 🙂
我也面临类似的问题。 通过从下面的链接通过步骤教程解决了这个问题。
http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/
- 要注意的主要问题是泽西库应正确放置在TOMCAT WEB-INF / lib文件夹中。 它由上面链接中提到的Eclipse设置自动完成。 它将创build一个具有相关JAR文件的WAR文件。 否则,您将遇到ClassNotFoundexception的问题。
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字节
- 第二个教程解释了如何创build一个生成和使用JSON输出的Web服务。
http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/
这两个链接都能很好地说明事情是如何运作的,并节省了大量的时间。
由于构buildpath问题,我们得到这个错误。 您应该在“构buildpath”中添加“ 服务器运行时 ”库。
"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"
请按照以下步骤解决找不到类的exception。
右键点击project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0
今天我遇到了同样的错误,虽然我使用的是Jersey 1.x,并且在我的类path中有正确的jar。 对于那些想要跟随这封信的vogella教程,并使用1.xjar子,你需要添加泽西库到WEB-INF / lib文件夹。 这一定会解决问题。
您需要将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>
你必须在你的web.xml中replace:
<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>
这是泽西2.x使用org.glassfish.jersey包而不是com.sun.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>
用你想要的版本replace2.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是捆绑在jaxrs-ri-2.2.1.zip中的 jersey-container-servlet-core.jar
JAX RS可以在没有mvn的情况下通过手动将包含在压缩文件jaxrs-ri-2.2.1.zip (我已经使用这个版本,可以与任何2.x版本一起工作)中包含的所有jar复制到WEB-INF / lib文件夹中来制定。 将libs复制到正确的文件夹使它们在运行时可用。
如果您使用eclipse构build和部署项目,则这是必需的。
在pom.xml文件中,我们需要添加
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.8</version> </dependency>