我正在尝试使用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>
我已从here下载了泽西JAX-RS 2.1 RI bundle
,并已在WEB-INF/lib
文件夹中添加了所有jar文件,如教程中所述。即使两天后也没有任何效果。我已经在Google上搜索了几次,显然使用Maven的人已经解决了它,但我没有使用Maven也没有写过那个教程的人。
只是为了检查导入的com.sun.jersey.spi.container.servlet.ServletContainer
中是否存在Jersey jars
我试图在Java中编写这个完全限定的名称并让intellisense完成名称,但在{{1}之后我无法获得任何智能感知所以我最后的猜测是,在最新的Jersey版本中有一些包重新排列,com.sun.je
不再在jersey
内。我很累,我很感激任何帮助。
答案 0 :(得分:147)
您已下载Jersey 2(JAX-RS 2的RI)。您所指的教程使用Jersey 1.从(here)下载Jersey 1.17.1,应该足够了。
Jersey 1使用com.sun.jersey
,Jersey 2使用org.glassfish.jersey
因此例外。
另请注意,泽西2不会识别以init-param
开头的com.sun.jersey
。
Registering Resources and Providers in Jersey 2包含有关如何在Jersey 2中注册类/实例的其他信息。
答案 1 :(得分:29)
如果你正在使用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>
答案 2 :(得分:22)
在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>
答案 3 :(得分:10)
这是一个日食设置问题,而不是泽西问题。
从这个线程ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer
右键单击您的eclipse项目Properties - &gt;部署组件 - &gt;添加 - &gt; Java构建路径条目 - &gt; Gradle Dependencies - &gt;完成。
因此,当Apache启动时,Eclipse并没有使用Gradle依赖项。
答案 4 :(得分:3)
试试这个:
org.glassfish.jersey.servlet.ServletContainer
在servlet-class
上答案 5 :(得分:2)
虽然我遵循了不同的指南,但我遇到了同样的问题:http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/
奇怪的是,在我使用的本指南中,我不应该对版本之间的兼容性(1.x与2.x)有任何问题,因为按照指南使用{{1上的jersey 1.8.x并且在pom.xml
中你引用了一个类(web.xml
),就像1.x版之前所说的那样。所以我可以推断这应该有效。
我的猜测 是因为我正在使用JDK 1.7这个类不再存在。
之后,我尝试在我之前解决了答案,没有帮助,我已对com.sun.jersey.spi.container.servlet.ServletContainer
和pom.xml
上的更改更改为:web.xml
据说应该存在!
由于此错误,我找到了一个“新”解决方案:http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/
使用Maven(原型),生成一个球衣项目,喜欢这个:
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
它对我有用! :)
答案 6 :(得分:2)
我也面临类似的问题。通过以下链接完成步骤教程解决了这个问题。
http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/
Apache的Tomcat的7.0.56 - - 窗口64 \ apache的 -Tomcat-7.0.56 \ web应用\ 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字节
http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/
这两个链接都很好地描述了工作原理并节省了大量时间。
答案 7 :(得分:1)
由于构建路径问题,我们收到此错误。您应该在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
答案 8 :(得分:0)
这主要取决于您使用的是哪种版本的球衣。如果您使用的是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文件夹
答案 9 :(得分:0)
如果有人试图使用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
答案 10 :(得分:0)
同样的错误,浪费了2个多小时的调试和尝试所有选项。我没有使用Maven / POM,所以我无法利用少数人给出的解决方案。
最后,下面解决了这个问题:将jar直接添加到tomcat / lib (不是WEB-INF \ lib)文件夹并重新启动tomcat。
答案 11 :(得分:0)
在pom.xml文件中我们需要添加
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.8</version>
</dependency>
答案 12 :(得分:0)
回到原来的问题 - 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(我已经使用过这个版本,适用于任何2.x版本)到WEB-INF / lib文件夹来解决。将libs复制到右侧文件夹使它们在运行时可用。
如果您使用eclipse来构建和部署项目,那么这是必需的。
答案 13 :(得分:0)
一个简单的解决方法是,检查eclipse的部署程序集中是否有依赖项或库。如果您使用的是tomcat,则服务器可能没有识别出我们正在使用的库。在这种情况下,在部署程序集中明确指定它。
答案 14 :(得分:0)
您必须在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,泽西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
答案 15 :(得分:0)
您需要将jersey-bundle-1.17.1.jar
添加到项目的库
<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 :(得分:0)
我今天遇到了同样的错误,虽然我使用的是Jersey 1.x,并且在我的类路径中有正确的jar。对于那些想要遵循vogella教程并使用1.x罐子的人,您需要将球衣库添加到WEB-INF / lib文件夹中。这肯定会解决问题。