我想在我的电脑上创建并运行一个简单的RESTful应用程序。 我在Microsoft Windows Xp操作系统上使用Eclipse Helios IDE上的Java编程语言和Apache Tomcat 7服务器。
我一直在尝试在我的电脑上复制this tutorial (from 3 to 3.4 steps)的相同程序,但它不起作用。
这就是我的所作所为:
使用Apache Tomcat 7设置
将我的Jersey和jsr311-api-1.0 jar文件放入项目\WEB-INF\lib\
目录
将代码部分从网页复制到我的项目
右键单击该项目,点击“运行方式 - >在服务器上运行”
试图访问http://localhost:8080/de.vogella.jersey.first/rest/hello
但是我看到的是:
为什么不起作用? 我做错了什么? 为什么呢?
非常感谢!
修改:
以下是控制台所说的内容:
25-set-2012 9.35.07 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Programmi\Java\jdk1.6.0_21\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Programmi/Java/jre6/bin/client;C:/Programmi/Java/jre6/bin;C:/Programmi/Java/jre6/lib/i386;C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\System32;C:\WINDOWS\;C:\WINDOWS\System32; C:\Programmi\R-Language\R-2.13.1\bin\;C:\Programmi\OpenVPN\bin\; C:\Programmi\Java\jdk1.6.0_21\bin\; "C:\ApacheMaven\apache-maven-3.0.4\bin";;C:\Programmi\eclipseEC;
25-set-2012 9.35.08 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVVERTENZA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:de.vogella.jersey.first' did not find a matching property.
25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.10 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 3459 ms
25-set-2012 9.35.10 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
25-set-2012 9.35.10 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.6
25-set-2012 9.35.11 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Jersey REST Service as unavailable
25-set-2012 9.35.12 org.apache.catalina.core.StandardContext loadOnStartup
GRAVE: Servlet /de.vogella.jersey.first threw load() exception
java.lang.ClassNotFoundException: javax.servlet.Filter
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1488)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4741)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5062)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5057)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.12 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1790 ms
也许有些课程缺失了?
答案 0 :(得分:22)
要解决您的问题,不使用Maven,您需要将JAX-RS facet添加到您的项目中。这里发生的事情是Eclipse没有将正确的库部署到服务器。可以通过项目的Properties |访问此配置项目的方面。
老实说,我不知道要添加哪些特定的jar来使Jersey工作,因为我使用Maven来管理依赖项。因此,我已经下载了Jersey bundle而不是zip文件,并使用它配置了JAX-RS方面。这可以在项目的属性|中看到部署程序集,其中Jersey的libs已配置为已部署。顺便提一下,您可以手动将已部署的库设置为服务器。
但后来我记得为什么我使用Maven来管理依赖项。该捆绑包不包含运行Jersey所需的所有内容。它缺少asm jar(存在于zip文件中)。所以我不得不将它添加到项目构建路径中,并手动重新配置部署程序集....
所以,这是一个带有Maven,Jersey和Eclipse的tutorial。试一试并得出结论:)
答案 1 :(得分:3)
我通过相同的教程开发了我的第一个RESTFUL服务。一开始我也有几次404错误所以我不断改变一些事情,最后它对我有用。这就是我做的 -
1)从URL-Pattern选项卡中删除其余部分;我认为这是错误的。 2)使用URL中的上下文根而不是包名。
我的网址是"http://mylocalhost:8080/contextroot/classname
,它是在@path注释中定义的。
答案 2 :(得分:2)
servlet.jar不应位于生成的war文件(或WEB-INF / lib)中。它应该由应用程序服务器本身提供。 (见Tomcat的FAQ)
如果您使用Maven构建项目,则可以将servlet api的范围设置为provided
(link)。
StackOverflow上的另一个类似问题。
答案 3 :(得分:2)
我重复了你的例子,它在我的机器上开箱即用。我下载了jersey-archive-1.14.zip并将包含的lib目录的全部内容放入WEB-INF / lib,而不仅仅是Jersey
和jsr311-api-1.0 jar
。
罐子是:
其中一些可能是不必要的,你可以尝试减少它们。但从所有这些开始。
但错误信息很奇怪。它说javax.servlet.Filter
遗失了,应该存在
<your tomcat dir>/lib/servlet-api.jar
。运行tomcat时,此文件始终位于类路径中。
答案 4 :(得分:1)
您需要从WEB-INF / lib目录中删除servlet.jar或包含javax.servlet.Filter的任何其他jar。
虽然您需要在编译类路径上使用类javax.servlet.Filter以便编译示例代码,但您需要确保不在Web应用程序中包含此类。从Tomcat类加载器HOWTO:
当Tomcat启动时,它会创建一组类加载器 组织成以下亲子关系,其中 父类加载器位于子类加载器之上:
Bootstrap | System | Common / \
Webapp1 Webapp2 ...
基本上,在Tomcat容器中配置的安全性可能无法正确找到webapp中的(可能)servlet.jar。
您可以通过打开详细类加载verbose:class
来查看是否从奇怪的位置加载了javax.servlet.Filter。搜索该类,如果它不是来自Tomcat库,则可能是您的问题。
答案 5 :(得分:0)
可能是你缺少servlet-api.jar。在/ WEB-INF / lib或类路径中添加最新的jar,看看它是否有效。
答案 6 :(得分:0)
似乎它没有在类路径中找到servlet jersey jar。确保包含它们。我假设你在测试这个权利之前打包成战并部署。因此,只需检查战争是否包含编译时应用程序可用的所有jar。
答案 7 :(得分:0)
像前面提到的答案一样。你错过了一些罐子。您可以在项目&gt; WebContent&gt; WEB-INF&gt; lib&gt; 文件夹中或在您的网络服务器的lib文件夹中添加这些jar文件(例如, \ apache-tomcat \ lib )
如果您希望我们告诉您缺少什么样的jar,请尝试粘贴两个lib文件夹的列表或屏幕截图。
希望这有帮助
答案 8 :(得分:0)
据我所知,您正在Eclipse中运行Tomcat。有可能你没有在计算机中使用安装目录(即你已经将JAR复制到的那个),但实际上是使用Eclipse在本地创建的临时副本(对不起,我不在我的开发计算机上,所以无法查看详细信息)?
从记忆中你有两个选择:
您需要更改Eclipse用于Tomcat的(工作)目录,使其成为您实际拥有Tomcat文件的目录。
您需要使用Eclipse中的GUI界面将JAR添加到Eclipse中的Tomcat。
或者,我在这里可能完全错了; - )
编辑:包括我正在谈论的位的屏幕截图。
对于我上面的选项:
答案 9 :(得分:0)
您应该添加所有在jersey 1.6存档中找到的jar,下载this存档并将所有jar添加到项目的 WebContent / WEB-INF / lib 文件夹中。< / p>
答案 10 :(得分:0)
我有这个错误超过一天!事实证明,问题来自使用不同版本的泽西岛。如果您使用我在下面提供的内容替换您的web.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>de.vogella.jersey.first</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>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
希望我的回答能为那些决定遵循相同教程的其他人节省大量时间!
答案 11 :(得分:0)
从WEB-INF / lib文件夹中删除servlet.jar。 Servlet.jar不应该在那里解决这个问题。
答案 12 :(得分:0)
我也遇到了HTTP状态404问题,遵循相同的教程。
首先,我尝试使用Jersey库1.18和2.15在Eclipse中设置JAX-RS Project Facet,但它不起作用。
最后,我通过用上下文根(即eclipse项目名称)替换URL中的包名(de.vogella.jersey.first)解决了这个问题。
mkyong.com的This tutorial给了我提示找到解决方案的提示。无论如何,我不知道URL中的包名是否肯定是一个错误,或者是否有一些配置细节可以使它工作。