无法在 Apache Tomcat 上运行 JAX-WS Java Web 服务

Pfl*_*ugs 5 java tomcat web-services jax-ws

概括

我的任务是编写 Java Web 服务以在我们的企业环境中集成两个不同的系统。由于我实际上是一名经验丰富的 C#.NET MVC 开发人员并且只认为自己是 Java 中级,因此我开始搜索“Java Web 服务教程”。我正在尝试运行此通用教程,但由于 HTTP 404 错误我无法运行教程服务。

过程

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

然后,我通过加载服务器的 Tomcat 管理器 GUI 并使用WAR 文件部署功能来部署 WAR 文件。当我这样做时,WAR 文件被复制,应用程序启动。但是,当我尝试通过教程中的链接“ http://localhost:8080/HelloWorld/hello ”访问该服务时,该服务返回 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,我从Oracle 的支持页面安装了JRE 1.7.0.75的匹配 Windows 版本。然后我从他们的档案中下载了Apache Tomcat 6.0.24 Windows 服务并成功安装,使用 JRE 1.7.0.75 和本地端口 1985(将它与 Netbeans 中使用的 GlassFish 本地服务器分开)。

就像在 Linux 服务器上一样,我的本地 Tomcat 服务器无法启动教程。手动单击启动命令链接会显示消息“失败 - 上下文路径 /com.mkyong.ws 上的应用程序无法启动”。我的本地服务器的日志也没有显示有关该应用程序无法启动的任何信息。

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

根据上述教程的第 5 部分,我将指定的 JAR 文件添加到服务器的 {$Tomcat}/lib 文件夹并重新启动服务器。这一次,应用程序启动了,但我仍然无法访问该服务。教程中的链接“ http://localhost:8080/HelloWorld/hello ”返回 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
  • 政策文件
  • stax-ex.jar
  • 流缓冲文件

在本地Tomcat Server开启DEBUG模式

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

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

当我第一次创建 Web 应用程序时,Netbeans 提出为我设置本地 Glassfish 服务器。我接受了,我用默认值设置了一切。当我尝试针对此服务器运行教程时,我无法访问该服务。教程中的链接“ http://localhost:8080/HelloWorld/hello ”仍然返回 404 错误。

研究其他帖子和教程

以下是我在没有找到解决方案的情况下查看的其他一些 StackOverflow 帖子和网站:

我正在思考的问题

  • 教程中的代码有问题吗?(似乎不太可能,因为从其他人已经成功的评论来看。)
  • 他在教程中使用的 Java 或 Tomcat 版本是否有显着差异?(他没有提供 Java 或 Tomcat 的版本。)
  • 我应该针对 JDK 而不是 JRE 运行本地 Tomcat 吗?
  • 本教程是否应该针对与 Tomcat 使用的 JDK 相同的 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。我还可以更改什么以获取其他日志消息?

我还在整个 Tomcat 目录中搜索了“com.mkyong”。只有 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
Run Code Online (Sandbox Code Playgroud)

更新 #3

我越来越确信某处存在配置问题。直觉,我研究并安装了适用于 Windows 的 Apache TomEE 1.7.2,指向与常规 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 上一样,URL教程中的http://localhost:8080/HelloWorld/hello ”仍然返回404错误。因此,结果完全相同。

由于没有针对其他版本的 JDK编译教程,我很快就没有想法了... :-)

更新 #4

根据下面的另一个请求,这是{$Tomcat}\lib文件夹中所有 JAR 文件的列表:

  • annotations-api.jar
  • 卡塔琳娜.jar
  • catalina-ant.jar
  • catalina-ha.jar
  • catalina-tribes.jar
  • el-api.jar
  • gmbal-api-only.jar
  • ha-api.jar
  • 碧玉文件
  • jasper-el.jar
  • jasper-jdt.jar
  • jaxb-core.jar
  • jaxb-impl.jar
  • jaxws-api.jar
  • jaxws-rt.jar
  • jsp-api.jar
  • 管理-api.jar
  • 政策文件
  • servlet-api.jar
  • stax-ex.jar
  • 流缓冲文件
  • tomcat-coyote.jar
  • tomcat-dbcp.jar
  • tomcat-i18n-es.jar
  • tomcat-i18n-fr.jar
  • tomcat-i18n-ja.jar

{$ Tomcat的} \ web应用文件夹包含以下内容:

  • ..\com.mkyong.ws
  • ..\docs
  • ..\例子
  • ..\主机管理器
  • ..\经理
  • ..\根
  • ..\com.mkyong.ws.war

更新 #5

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

{$Tomcat}/webapps 文件夹中的 com.mkyong.ws 模块目录截图

这是 Tomcat 管理器 GUI 的屏幕截图:

Tomcat 管理器 GUI 的屏幕截图

这是我与 URL 一起收到的 HTTP 404 错误的屏幕截图:

HTTP 404 错误的屏幕截图

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

NIK*_*ARY 3

您的 ws 模块部署存在问题。您刚刚从 MKyoung 示例中复制了整个文件夹。我不这样工作。

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

模块名称必须为 Sample 而不是 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
Run Code Online (Sandbox Code Playgroud)