使用Java的RESTful web服务创建教程,Eclipse。Apache Tomcat,不工作

使用Java的RESTful web服务创建教程,Eclipse。Apache Tomcat,不工作,java,eclipse,rest,tomcat,web-applications,Java,Eclipse,Rest,Tomcat,Web Applications,我想在我的电脑上创建并运行一个简单的RESTful应用程序。 我在EclipseHeliosIDE上使用Java编程语言,在MicrosoftWindowsXP操作系统上使用ApacheTomcat7服务器 我一直试图在我的电脑上复制相同的过程,但它不起作用 以下是我所做的: 使用ApacheTomcat7设置在Eclipse上创建了一个动态项目 将我的Jersey和jsr311-api-1.0 jar文件放入项目\WEB-INF\lib\目录 已将网页中的代码部分复制到我的项目中 右键单击项

我想在我的电脑上创建并运行一个简单的RESTful应用程序。 我在EclipseHeliosIDE上使用Java编程语言,在MicrosoftWindowsXP操作系统上使用ApacheTomcat7服务器

我一直试图在我的电脑上复制相同的过程,但它不起作用

以下是我所做的:

  • 使用ApacheTomcat7设置在Eclipse上创建了一个动态项目

  • 将我的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

可能缺少某些类?

可能缺少servlet-api.jar。在您的/WEB-INF/lib或类路径中添加最新的jar,看看它是否有效。

似乎在类路径中找不到servlet jar。确保包括它们。我假设您在测试这项权利之前,将其打包并部署到一场战争中。因此,只需检查war是否包括应用程序在编译时可用的所有JAR

就像前面提到的答案一样。你少了一些罐子。您可以将这些jar文件添加到Project>WebContent>WEB-INF>lib>文件夹或WEB服务器的lib文件夹中(例如,\apache tomcat\lib

如果您想让我们告诉您缺少的确切jar,请尝试粘贴两个lib文件夹的列表或屏幕截图


希望这有帮助

您需要从WEB-INF/lib目录中删除servlet.jar或任何其他包含javax.servlet.Filter的jar

虽然您需要在编译类路径上使用javax.servlet.Filter类来编译示例代码,但您需要确保您的webapp中不包含此类。从Tomcat类加载器HOWTO:

启动Tomcat时,它会创建一组 组织成以下父子关系,其中 父类加载器位于子类加载器之上:

  Bootstrap
      |
   System
      |
   Common
   /     \   
Webapp1 Webapp2

基本上,webapp中的(可能)servlet.jar可能找不到正确的d/t,即Tomcat容器中配置的安全性


通过启用详细类加载
verbose:class
,可以查看javax.servlet.Filter是否从一个奇怪的位置加载。如果类不是来自Tomcat libs,则搜索该类,这可能是您的问题。

servlet.jar不应位于生成的war文件中(或WEB-INF/lib中)。它应该由应用服务器本身提供。(见Tomcat的) 如果您正在使用Maven构建项目,则可以将ServletAPI的范围设置为提供的
()


这里还有一个类似的问题。

据我所知,您正在Eclipse中运行Tomcat。您可能没有使用计算机中的安装目录(即您将JAR复制到的安装目录),但实际上正在使用Eclipse在本地创建的临时副本(抱歉,我不在我的开发计算机atm上,因此无法检查详细信息)

从内存中,您有两个选项:

  • 您需要将Eclipse用于Tomcat的(工作)目录更改为您实际拥有Tomcat文件的目录

  • 您需要使用Eclipse中的GUI界面将JAR添加到Eclipse中的Tomcat中

  • 或者,我可能完全错了;-)

    编辑:包括我正在谈论的比特的屏幕截图

    对于我的上述选项:

    请注意中间的“服务器位置”需要“控制Tomcat安装”。
  • 当您单击下图“常规信息”框中的“打开启动配置”链接时,您可以在类路径选项卡中添加它们

  • 要解决您的问题,在不使用Maven的情况下,您需要将JAX-RS方面添加到您的项目中。这里发生的事情是Eclipse没有将正确的libs部署到服务器上。可以通过项目的属性|项目的面访问此配置

    老实说,我不知道要添加哪些特定的jar使Jersey工作,因为我使用Maven来管理依赖项。因此,我下载了,并用它配置了JAX-RS方面,而不是zip文件。这可以在项目的属性部署程序集上看到,Jersey的libs已经配置为部署。顺便说一下,您可以手动将已部署的libs设置到服务器

    但后来我想起了为什么我使用Maven来管理依赖关系。捆绑包并不包含运行Jersey所需的所有内容。它缺少asm jar(存在于zip文件中)。所以我不得不将其添加到项目构建路径中,并手动重新配置反部署程序集


    这是一个关于Maven、Jersey和Eclipse的例子。尝试一下并得出结论:)

    我重复了你的例子,它在我的机器上是现成的。我下载了包含的lib目录的全部内容,并将其放入WEB-INF/lib中,而不仅仅像您那样下载了
    Jersey
    jsr311-api-1.0jar

    这些罐子是:

    • asm-3.1.jar
    • jackson-core-asl-1.9.2.jar
    • jackson-jaxrs-1.9.2.jar
    • jackson-mapper-asl-1.9.2.jar
    • jackson-xc-1.9.2.jar
    • jersey-client-1.14.jar
    • jersey-core-1.14.jar
    • jersey-json-1.14.jar
    • jersey-server-1.14.jar
    • jersey-servlet-1.14.jar
    • 抛弃-1.1.jar
    • jsr311 ap
          <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>