[英]Running a RESTful Web Service in Eclipse with Apache Tomcat
[英]RESTful web service creation tutorial with Java, Eclipse. Apache Tomcat, not working
我想在我的电脑上创建并运行一个简单的RESTful应用程序。 我在Microsoft Windows Xp操作系统上使用Eclipse Helios IDE上的Java编程语言和Apache Tomcat 7服务器。
我一直试图在我的电脑上复制本教程的相同程序(从3到3.4步) ,但它不起作用。
这是我做的:
使用Apache Tomcat 7设置在Eclipse上创建了一个Dynamic项目
把我的Jersey和jsr311-api-1.0 jar文件放到project \\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
也许有些课程失踪了?
要解决您的问题,不使用Maven,您需要将JAX-RS facet添加到项目中。 这里发生的是Eclipse没有将正确的lib部署到服务器 。 可以通过项目的Properties |访问此配置 项目的方面。
说实话,我不知道要添加哪些特定的罐子来使Jersey工作,因为我使用Maven来管理依赖。 因此,我已经下载了Jersey软件包 ,并使用它配置了JAX-RS方面,而不是zip文件。 这可以在项目的属性|中看到 部署程序集,其中Jersey的libs已配置为已部署。 顺便提一下,您可以手动将已部署的库设置为服务器。
但后来我想起了为什么我使用Maven来管理依赖项。 该捆绑包不包含运行Jersey所需的所有内容。 它缺少asm jar(存在于zip文件中)。 所以我不得不将它添加到项目构建路径,并手动重新配置部署组件....
所以,这是Maven,Jersey和Eclipse的教程 。 试一试,得出你的结论:)
我通过相同的教程开发了我的第一个RESTFUL服务。 一开始我也有几次404错误所以我不断改变一些事情,最后它对我有用。 这就是我所做的 -
1)从URL-Pattern选项卡中删除其余部分; 我认为这是错误的。 2)使用URL中的上下文根而不是包名。
我的网址是"http://mylocalhost:8080/contextroot/classname
,它是在@path注释中定义的。
希望能帮助到你。
servlet.jar不应该出现在生成的war文件中(或者在WEB-INF / lib中)。 它应该由应用程序服务器本身提供。 (请参阅Tomcat的常见问题解答 )如果您使用Maven构建项目,则可以按provided
servlet api的范围( 链接 )。
StackOverflow上的另一个类似问题。
我重复了你的例子,它在我的机器上开箱即用。 我下载了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时,此文件始终位于类路径中。
您需要从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库,那可能是你的问题。
可能是你缺少servlet-api.jar。 在/ WEB-INF / lib或类路径中添加最新的jar,看看它是否有效。
它似乎没有在类路径中找到servlet jersey jar。 确保包含它们。 我假设你在测试这个权利之前打包成战并部署。 因此,只需检查战争是否包含编译时应用程序可用的所有jar。
像之前的答案一样。 你错过了一些罐子。 您可以在Project> WebContent> WEB-INF> lib>文件夹中或在webserver的lib文件夹中添加这些jar文件(例如, \\ apache-tomcat \\ lib )
如果您希望我们告诉您缺少什么样的jar,请尝试粘贴两个lib文件夹的列表或屏幕截图。
希望这可以帮助
据我所知,您正在Eclipse中运行Tomcat。 有可能你没有在计算机中使用安装目录(即你已经将JAR复制到的那个),但实际上是使用Eclipse在本地创建的临时副本(对不起,我不在我的开发计算机上,所以无法查看详细信息)?
从记忆中你有2个选择:
您需要更改Eclipse用于Tomcat的(工作)目录,使其成为您实际拥有Tomcat文件的目录。
您需要使用Eclipse中的GUI界面将JAR添加到Eclipse中的Tomcat。
或者,我在这里可能完全错了;-)
编辑:包括我正在谈论的位的截图。
对于我上面的选择:
您应该添加所有在jersey 1.6存档中找到的jar,下载此存档并将所有jar添加到项目的WebContent / WEB-INF / lib文件夹中。
我有这个错误超过一天! 事实证明,问题来自使用不同版本的泽西岛。 如果您使用我在下面提供的内容替换您的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>
希望我的答案能为那些决定遵循相同教程的其他人节省大量时间!
从WEB-INF / lib文件夹中删除servlet.jar。 Servlet.jar不应该在那里解决这个问题。
我也遇到了HTTP状态404问题,遵循相同的教程。
首先,我尝试使用Jersey库1.18和2.15在Eclipse中设置JAX-RS Project Facet,但它不起作用。
最后,我通过用上下文根(即eclipse项目名称)替换URL中的包名(de.vogella.jersey.first)来解决问题。
mkyong.com的这个教程给了我提示找到解决方案。 无论如何,我不知道URL中的包名是否肯定是一个错误,或者是否有一些配置细节可以使它工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.