无法在Apache Tomcat

时间:2015-08-17 20:27:41

标签: java web-services tomcat jax-ws

摘要

我的任务是编写一个Java Web服务,在我们的企业环境中集成两个不同的系统。由于我实际上是一位经验丰富的C#.NET MVC开发人员,并且只考虑自己是Java的中间人,所以我开始搜索" Java Web服务教程"。我正在尝试运行this common tutorial,但由于HTTP 404错误,我无法运行教程服务。

过程

我在 Netbeans 8.0.2 中使用Java Web应用程序模板。我使用 JDK 1.6.0.25 来编译教程(因为我需要编写的最终服务需要这个Java版本与我将要使用的其他JAR兼容)。一切都可以编译成WAR文件。

然后我通过加载服务器的Tomcat Manager GUI并使用 WAR文件部署功能来部署WAR文件。当我这样做时,将复制WAR文件,并启动应用程序。但是,当我尝试通过链接" http://localhost:8080/HelloWorld/hello"从tutorial开始,服务返回404错误。

服务器环境

  • Oracle Enterprise Linux发行版,版本3.8.13-44.1.1.el6uek.x86_64
  • Apache Tomcat 6.0.24
  • JVM 1.7.0_75-mockbuild_2015_01_20_16_42-b00

如果建议是我需要更改Java或Tomcat版本或平台,我需要知道这一点,因为我对这些技术的经验很少。但是,由于Linux发行版的限制(我的服务器管理员),我可能无法更改所有因素。

我尝试过的事情(按顺序):

在Windows上设置本地Tomcat服务器

我在Windows 7笔记本电脑上安装了本地Tomcat服务器。由于Linux服务器运行的是Java 1.7.0.75,因此我从JRE 1.7.0.75安装了匹配的Windows版Oracle's support page。然后我从Apache Tomcat 6.0.24 Windows Service下载their archives并使用JRE 1.7.0.75和本地端口1985成功安装它(将其与Netbeans中使用的GlassFish本地服务器分开)。

就像在Linux服务器上一样,我的本地Tomcat服务器无法启动教程。手动单击开始命令链接会向我显示消息" FAIL - 上下文路径/com.mkyong.ws上的应用程序无法启动"。我的本地服务器日志不会显示该应用程序无法启动的任何内容。

将JAX-WS RI JAR文件添加到{$ Tomcat} / lib

根据tutorial mentioned above的第5部分,我将指示的JAR文件添加到服务器的{$ Tomcat} / lib文件夹中,然后重新启动服务器。这次,应用程序已启动,但我仍然无法访问该服务。链接" http://localhost:8080/HelloWorld/hello"从tutorial返回404错误。我甚至尝试将整个JAX-WS RI / lib文件夹复制到{$ Tomcat} / lib目录而没有任何更改,所以我撤销了这一更改。

作为参考,这里列出了我复制过的文件:

  • gmbal-API-only.jar
  • HA-api.jar文件
  • JAXB-core.jar添加
  • JAXB-impl.jar中
  • JAXWS-api.jar文件
  • JAXWS-rt.jar中
  • 管理-api.jar文件
  • policy.jar
  • STAX-ex.jar
  • streambuffer.jar

在本地Tomcat服务器

中启用DEBUG模式

我取消部署了WAR文件。使用 Apache Tomcat Monitor ,我停止了服务,删除了现有日志,启用了DEBUG日志记录级别,并重新启动了服务。然后我重新部署了教程WAR文件。我再次看到它没有启动,然后我打开了所有日志文件。甚至没有提到无法访问该服务,但可能没有记录404错误。

使用Netbeans嵌入式Glassfish服务器运行服务

当我第一次创建Web应用程序时,Netbeans提供了一个本地Glassfish服务器。我接受了,我用默认设置了一切。当我尝试针对此服务器运行教程时,我无法访问该服务。链接" http://localhost:8080/HelloWorld/hello"来自tutorial仍会返回404错误。

研究其他帖子和教程

以下是我在未找到解决方案的情况下审核过的其他一些StackOverflow帖子和网站:

我正在考虑的问题

  • 教程中的代码有问题吗? (从其他人的评论中看起来很可能没有成功。)
  • 他在教程中使用的Java或Tomcat版本是否存在显着差异? (他没有提供Java或Tomcat的版本。)
  • 我应该针对JDK而不是JRE运行本地Tomcat吗?
  • 是否应该根据Tomcat使用的相同JDK编译教程? (我希望不会因为这似乎非常有限......)
  • 我甚至可以在Tomcat中运行JAX-WS吗? (基于像http://tomee.apache.org/apache-tomee.html这样的页面,似乎基础TOmcat甚至可能不支持JAX-WS?再次,仅仅是我有限的经验。)

我很感激任何人都可以提供的任何故障排除指导。 提前感谢您的帮助!

更新#1

根据@NIKETBHANDARY的请求,我停止了服务,删除了日志,重新启动了服务,并在Chrome浏览器中浏览到localhost:1985 / helloworld / hello - 仍然收到404错误。然后我打开了 catalina.log 文件,但它完全是空的。只有 jakarta_service.log 有任何日志条目,并且所有日志条目都与服务启动有关。我还验证了日志记录级别设置为 debug 。还有什么可以更改以获取其他日志消息?

我还搜索了" com.mkyong"在整个Tomcat目录中。只有webapp WAR文件,webapps /../ META-INF / context.xml,webapps /../ WEB-INF / sun-jaxws.xml和/conf/cataline/localhost/com.mkyong.we.xml文件返回任何命中。任何日志都没有。这可能表明这是一个配置问题吗?

更新#2

显然,Tomcat不会完全刷新其日志消息,直到线程在服务关闭时关闭(可能是由于日志记录配置)。因此,我停止了刷新日志文件的服务。这是 catalina.log 文件的全部内容(其中包含对com.mkyong的引用):

Aug 17, 2015 9:51:17 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.19.
Aug 17, 2015 9:51:17 PM org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
Aug 17, 2015 9:51:19 PM org.apache.coyote.http11.Http11AprProtocol init
INFO: Initializing Coyote HTTP/1.1 on http-1985
Aug 17, 2015 9:51:19 PM org.apache.coyote.ajp.AjpAprProtocol init
INFO: Initializing Coyote AJP/1.3 on ajp-8009
Aug 17, 2015 9:51:19 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2121 ms
Aug 17, 2015 9:51:19 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Aug 17, 2015 9:51:19 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.24
Aug 17, 2015 9:51:19 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor com.mkyong.ws.xml
Aug 17, 2015 9:51:20 PM com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextInitialized
INFO: WSSERVLET12: JAX-WS context listener initializing
Aug 17, 2015 9:51:22 PM com.sun.xml.ws.transport.http.servlet.WSServletDelegate <init>
INFO: WSSERVLET14: JAX-WS servlet initializing
Aug 17, 2015 9:51:22 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor host-manager.xml
Aug 17, 2015 9:51:22 PM org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor manager.xml
Aug 17, 2015 9:51:22 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
Aug 17, 2015 9:51:22 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory examples
Aug 17, 2015 9:51:22 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory ROOT
Aug 17, 2015 9:51:22 PM org.apache.coyote.http11.Http11AprProtocol start
INFO: Starting Coyote HTTP/1.1 on http-1985
Aug 17, 2015 9:51:22 PM org.apache.coyote.ajp.AjpAprProtocol start
INFO: Starting Coyote AJP/1.3 on ajp-8009
Aug 17, 2015 9:51:22 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3895 ms

更新#3

我越来越相信某处存在配置问题。在预感中,我研究并安装了Apache TomEE 1.7.2 for Windows,指向与常规Tomcat相同的JRE。在研究了running.txt文件并尝试了属性和设置之后,我终于可以启动本地版本的TomEE了。我像以前一样部署了相同的WAR文件,并且由于以下错误我发现它不会加载WAR应用程序:

  

java.lang.ClassNotFoundException:com.sun.xml.ws.transport.http.servlet.WSServletContextListener

谷歌搜索该错误(再次)到MKYong的博客进行修复(将jaxws-rt.jar文件复制到 {$ tomcat} / lib 文件夹。我重新部署了WAR文件,然后管理器加载了应用程序。但是,就像在常规Tomcat上一样,来自http://localhost:8080/HelloWorld/hello的URL&#34; tutorial&#34;仍然会返回404错误。因此,结果是完全一样。

如果没有针对其他版本的JDK编译tutorial,我很快就会想到......: - )

更新#4

根据下面的另一个请求,此处列出了 {$ Tomcat} \ lib 文件夹中的所有JAR文件:

  • 注释-api.jar文件
  • catalina.jar
  • 卡塔利娜-的ant.jar
  • 卡塔利娜-ha.jar
  • 卡塔利娜-tribes.jar
  • EL-api.jar文件
  • gmbal-API-only.jar
  • HA-api.jar文件
  • jasper.jar
  • 碧玉el.jar
  • 碧玉jdt.jar
  • JAXB-core.jar添加
  • JAXB-impl.jar中
  • JAXWS-api.jar文件
  • JAXWS-rt.jar中
  • 的jsp-api.jar文件
  • 管理-api.jar文件
  • policy.jar
  • servlet的api.jar文件
  • STAX-ex.jar
  • streambuffer.jar
  • Tomcat的coyote.jar
  • Tomcat的dbcp.jar
  • Tomcat的I18N-es.jar
  • Tomcat的I18N-fr.jar
  • Tomcat的I18N-ja.jar

{$ Tomcat} \ webapps 文件夹包含以下内容:

  • .. \ com.mkyong.ws
  • .. \文档
  • .. \实例
  • .. \主机管理器
  • .. \管理器
  • .. \ ROOT
  • .. \ com.mkyong.ws.war

更新#5

{$ Tomcat} \ webapps \ com.mkyong.ws 目录包含以下内容:

screenshot of com.mkyong.ws module directory in {$Tomcat}/webapps folder

这是Tomcat Manager GUI的屏幕截图:

screenshot of the Tomcat Manager GUI

以下是我收到的HTTP 404错误的屏幕截图:&/ p>

screenshot of the HTTP 404 error

我还确认WAR中的文件与tutorial完全匹配。

2 个答案:

答案 0 :(得分:3)

部署ws模块时出现问题。 你刚刚从MKyoung样本中复制了整个文件夹。 我不这样做。

现在不仅显示ws模块中的所有文件夹和文件结构,还要删除帖子中的其余模块。我只想要ws模块的结构。

模块名称必须采样而不是com.mkyoung.ws 它的结构必须是

**sample**
------WEB-INF
------index.jsp

WEB-INF
----classes
----web.xml
----sun-jaxws.xml

classes
----com
--------mkyoung
-----------ws
ws
-----Helloworld.class
-----HeloworldIMPL.class

答案 1 :(得分:3)

@NIKETBHANDARY帮助我了解错误以及如何快速纠正错误。我还想准确发布我做错了什么,以及我如何永久修复它,以便将来的编码员可以从我五天的经验中受益。 : - )

当我最初使用Netbeans构建教程时,我使用了 Java Web - &gt; Web应用程序模板(安装 Java EE Base 插件后可通过 Netbeans - &gt;工具 - &gt;插件访问):

Netbeans Project Template

我按照the tutorial精确构建了所有文件,但我没有真正阅读第5步,特别是这一行:

<jar jarfile="${dist}/war/HelloWorld-${DSTAMP}.war" basedir="${dist}/war/build/"/>

经过进一步审查,我发现构建脚本正在生成一个名为 HelloWorld.war 的WAR文件。然后,当该文件部署到Tomcat时,Web应用程序在Tomcat管理器中被称为 HelloWorld 。这就是服务端点设置为http://localhost:8080/HelloWorld/hello的原因。 &#34; HelloWorld&#34;字面意思是Tomcat应用程序的名称,&#34; / hello&#34; part与 sun-jaxws.xml 文件中的端点对应。 (回想一下,鉴于典型的网络托管组织,它完全有道理.IIS几乎以同样的方式工作。)

因此,为了解决这个问题,我需要修改Netbeans项目以生成名为 HelloWorld.war 的WAR文件。在the tutorial中,他包含一个实际的Ant构建脚本。在这种情况下,我需要采取以下步骤:

  1. 在Netbeans Project Explorer中右键单击项目。
  2. 选择属性
  3. 点击构建 - &gt;包装类别。
  4. 将WAR文件字段设置为 HelloWorld.war
  5. 以下是截图:

    enter image description here

    一旦完成,我创建了一个新的构建,部署到我的本地Tomcat服务器,一切都按预期工作。我还能够将WAR文件部署到我的Linux服务器并成功测试它。问题解决了! : - )