16

我想在我的电脑上创建并运行一个简单的 RESTful 应用程序。我在 Eclipse Helios IDE 上使用 Java 编程语言,在 Microsoft Windows Xp 操作系统上使用 Apache Tomcat 7 服务器。

我一直在尝试在我的电脑上复制本教程的相同过程(从 3 到 3.4 步骤),但它不起作用。

这是我所做的:

  • 使用 Apache Tomcat 7 设置在 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

也许缺少一些课程?

4

13 回答 13

22

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

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

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

所以,这里有一个关于 Maven、Jersey 和 Eclipse的教程。试试看,得出你的结论:)

于 2012-10-04T02:35:39.507 回答
3

我通过相同的教程开发了我的第一个 RESTFUL 服务。一开始我也遇到了几次 404 错误,所以我一直在改变一些东西,最后它对我有用。这就是我所做的-

1) 从 URL-Pattern 选项卡中删除了其余部分;我认为那是错误的。2) 在 URL 中使用上下文根而不是包名。

我的 url 是"http://mylocalhost:8080/contextroot/classname在 @path 注释中定义的。

希望能帮助到你。

于 2012-11-24T05:50:07.907 回答
2

servlet.jar 不应位于生成的war 文件中(或 WEB-INF/lib 中)。它应该由应用程序服务器本身提供。(参见 Tomcat 的常见问题解答) 如果您使用 Maven 构建项目,您可以将 servlet api 的范围设置为provided链接)。

StackOverflow上的另一个类似问题。

于 2012-09-29T18:22:18.020 回答
2

我重复了你的例子,它在我的机器上开箱即用。我下载了 jersey-archive-1.14.zip并将包含的 lib 目录的全部内容放入 WEB-INF/lib 中,而不是Jerseyjsr311-api-1.0 jar您所做的那样。

罐子是:

  • asm-3.1.jar
  • 杰克逊核心asl-1.9.2.jar
  • 杰克逊-jaxrs-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • 杰克逊-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-api-1.1.1.jar

其中一些可能是不必要的,您可以尝试减少它们。但从所有这些开始。

但是,错误消息很奇怪。它说javax.servlet.Filter缺少,应该住在 <your tomcat dir>/lib/servlet-api.jar. 当您运行 tomcat 时,此文件始终位于类路径中。

于 2012-10-04T08:36:20.623 回答
1

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

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

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

  Bootstrap
      |
   System
      |
   Common
   /     \   

网络应用 1 网络应用 2 ...

基本上,在 Tomcat 容器中配置的安全性可能无法正确找到 webapp 中的(可能)servlet.jar。

您可以通过打开详细类加载来查看是否正在从奇怪的位置加载 javax.servlet.Filter verbose:class。搜索类,如果它不是来自 Tomcat 库,那可能是你的问题。

于 2012-09-29T17:39:01.053 回答
0

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

于 2012-09-28T20:01:55.363 回答
0

May be you are missing servlet-api.jar. Add latest jar in your /WEB-INF/lib or classpath and see of it works or not.

于 2012-09-28T16:31:15.187 回答
0

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

根据记忆,您有两个选择:

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

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

或者,我在这里可能完全错了;-)

编辑:包括我正在谈论的位的屏幕截图。

对于我上面的选项:

  1. 请参阅中间的“服务器位置”需要在“控制 tomcat 安装”的位置。
  2. 当您单击下图中“常规信息”框中的“打开启动配置”链接时,将它们添加到类路径选项卡中

在此处输入图像描述

于 2012-10-04T01:12:26.890 回答
0

按照相同的教程,我也遇到了 HTTP 状态 404 问题。

首先,我尝试使用 Jersey 库 1.18 和 2.15 在 Eclipse 中设置 JAX-RS Project Facet,但没有成功。

最后我通过用上下文根(即eclipse项目名称)替换URL中的包名(de.vogella.jersey.first)解决了这个问题。

mkyong.com 的本教程给了我寻找解决方案的提示。无论如何,我不知道 URL 中的包名称是否肯定是错误的,或者是否有一些配置细节可以使其正常工作。

于 2015-01-29T14:45:33.447 回答
0

我有这个错误超过一天!事实证明,问题来自于不同版本的 Jersey 的使用。如果你用我在下面展示的内容替换你的 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>

希望我的回答能为也决定遵循相同教程的其他人节省大量时间!

于 2014-02-12T17:03:33.753 回答
0

从 WEB-INF/lib 文件夹中删除 servlet.jar。Servlet.jar 不应该在那里,这为我解决了这个问题。

于 2014-07-28T21:17:06.450 回答
0

您应该添加在 jersey 1.6 存档中找到的所有 jar,下载存档并将所有 jar 添加到项目的WebContent/WEB-INF/lib文件夹中。

于 2012-12-17T06:49:11.283 回答
0

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

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

希望这可以帮助

于 2012-09-29T00:03:53.533 回答