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

Cannot run JAX-WS Java Web Service on Apache Tomcat

总结

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

进程

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

然后我通过加载服务器的 Tomcat 管理器 GUI 并使用 WAR 文件部署 功能来部署 WAR 文件。当我这样做时,WAR 文件被复制,应用程序启动。但是,当我尝试通过 link“http://localhost:8080/HelloWorld/hello" from the tutorial 访问服务时,服务 returns 出现 404 错误。

服务器环境

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

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

在 Windows

上设置本地 Tomcat 服务器

我在 Windows 7 笔记本电脑上安装了一个本地 Tomcat 服务器。由于 Linux 服务器是 运行ning Java 1.7.0.75,我使用 JRE 1.7 安装了 JRE 1.7.0.75 from Oracle's support page. I then downloaded Apache Tomcat 6.0.24 Windows Service from their archives 的匹配 Windows 版本并成功安装。 0.75 和本地端口 1985(将其与 Netbeans 中使用的 GlassFish 本地服务器分开)。

就像在Linux服务器上一样,我的本地Tomcat服务器无法启动教程。手动单击 start 命令 link 给我消息 "FAIL - Application at context path /com.mkyong.ws could not be started"。我的本地服务器的日志也没有显示有关该应用程序无法启动的任何信息。

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

根据上述 教程 的第 5 节,我将指定的 JAR 文件添加到服务器的 {$Tomcat}/lib 文件夹并重新启动服务器。这次,应用程序启动了,但我仍然无法访问该服务。 link "http://localhost:8080/HelloWorld/hello" from the tutorial returns 一个 404 错误。我什至尝试将整个 JAX-WS RI/lib 文件夹复制到 {$Tomcat}/lib 目录没有变化,所以我放弃了这个变化。

作为参考,这是我复制的文件列表:

在本地 Tomcat 服务器中启用 DEBUG 模式

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

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

当我第一次创建 Web 应用程序时,Netbeans 提出要为我设置一个本地 Glassfish 服务器。我接受了,并使用默认值设置了所有内容。当我尝试针对此服务器 运行 教程时,我无法访问该服务。 link "http://localhost:8080/HelloWorld/hello" from the tutorial 仍然是 returns 404 错误。

正在研究其他帖子和教程

以下是我查看过但未找到解决方案的其他一些 Whosebug 帖子和网站:

我在思考的问题

如果有人能提供任何疑难解答指导,我将不胜感激。 提前感谢您的帮助!

更新 #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

更新 #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 上一样,URL “http://localhost:8080/HelloWorld/hello" from the tutorial 仍然是 returns 404错误。所以,结果完全一样。

没有针对 JDK 的其他版本编译 tutorial,我 运行 很快就没有想法了...:-)

更新#4

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

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

更新 #5

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

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

这是我收到的 HTTP 404 错误以及 URL:

的屏幕截图

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

部署您的 ws 模块时出现问题。 您刚刚从 MKyoung 示例中复制了整个文件夹。 我不是那样工作的。

不仅现在显示 ws 模块内的所有文件夹和文件结构,从您的 post.I 中删除其余模块只需要 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

@NIKETBHANDARY 帮助我了解出了什么问题以及如何快速纠正它。我还想 post 确切地说明我做错了什么以及我是如何永久修复它的,以便未来的编码人员可以从我五天的经验中受益。 :-)

当我最初使用 Netbeans 构建教程时,我使用了 Java Web --> Web Application 模板(安装 Java EE Base 插件可通过 Netbeans --> 工具 --> 插件):

我完全按照 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 的原因。 "HelloWorld" 字面上是 Tomcat 应用程序的名称,“/hello” 部分对应于 sun-jaxws.xml 文件中的端点. (回过头来看,对于典型的 Web 托管组织来说,这是完全合理的。IIS 的工作方式几乎相同。)

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

  1. 在 Netbeans 项目资源管理器中右键单击该项目。
  2. 选择属性
  3. 单击 构建 --> 打包 类别。
  4. 将 WAR 文件字段设置为 HelloWorld.war.

这是截图:

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