【发布时间】:2015-08-17 20:27:41
【问题描述】:
总结
我的任务是编写一个 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 管理器 GUI 并使用 WAR 文件来部署 功能来部署 WAR 文件。当我这样做时,WAR 文件被复制,应用程序启动。但是,当我尝试通过来自tutorial 的链接“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's support page 安装了匹配的 Windows 版本的 JRE 1.7.0.75。然后我从their archives 下载Apache Tomcat 6.0.24 Windows Service 并成功安装,使用JRE 1.7.0.75 和本地端口1985(将其与Netbeans 中使用的GlassFish 本地服务器分开)。
就像在 Linux 服务器上一样,我的本地 Tomcat 服务器无法启动教程。手动单击 start 命令链接会显示消息“失败 - 无法启动上下文路径 /com.mkyong.ws 的应用程序”。我的本地服务器的日志也没有显示该应用程序无法启动的任何信息。
将 JAX-WS RI JAR 文件添加到 {$Tomcat}/lib
根据tutorial mentioned above 的第 5 节,我随后将指示的 JAR 文件添加到服务器的 {$Tomcat}/lib 文件夹并重新启动服务器。这一次,应用程序启动了,但我仍然无法访问该服务。 tutorial 中的链接“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
- management-api.jar
- policy.jar
- stax-ex.jar
- streambuffer.jar
在本地 Tomcat 服务器中启用 DEBUG 模式
我取消了 WAR 文件的部署。使用 Apache Tomcat Monitor,我停止了服务,删除了现有日志,启用了 DEBUG 日志记录级别,然后重新启动了服务。然后我重新部署了教程 WAR 文件。我再次看到它没有启动,然后我打开了所有日志文件。甚至没有提及访问服务失败,但可能没有记录 404 错误。
使用 Netbeans 嵌入式 Glassfish 服务器运行服务
当我第一次创建 Web 应用程序时,Netbeans 提议为我设置一个本地 Glassfish 服务器。我接受了,我将所有内容都设置为默认值。当我尝试针对此服务器运行教程时,我无法访问该服务。 tutorial 中的链接“http://localhost:8080/HelloWorld/hello”仍然返回 404 错误。
研究其他帖子和教程
以下是我查看过的其他一些 StackOverflow 帖子和网站,但没有找到解决方案:
- JAX-WS on Tomcat server(不适用)
- Deploying JAX-WS webservice as War in Apache Tomcat(类似于tutorial建议复制额外的JAR文件)
- JAX-RPC / JAX-WS runtime in Apache Tomcat(仅供参考)
- how to deploy a jax-ws service to eclipse or tomcat?(类似于tutorial建议复制额外的JAR文件)
- https://myarch.com/create-jax-ws-service-in-5-minutes/(类似于tutorial,但没有部署帮助)
我正在思考的问题
- 教程中的代码有问题吗? (似乎不太可能,因为从 cmets 其他人取得了成功。)
- 他在教程中使用的 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
更新 #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 上一样,来自tutorial 的 URL“http://localhost:8080/HelloWorld/hello”仍然返回 404 错误。因此,结果完全相同。
没有针对其他版本的 JDK 编译 tutorial,我很快就没有想法了... :-)
更新 #4
根据下面的另一个请求,以下是 {$Tomcat}\lib 文件夹中所有 JAR 文件的列表:
- annotations-api.jar
- catalina.jar
- catalina-ant.jar
- catalina-ha.jar
- catalina-tribes.jar
- el-api.jar
- gmbal-api-only.jar
- ha-api.jar
- jasper.jar
- jasper-el.jar
- jasper-jdt.jar
- jaxb-core.jar
- jaxb-impl.jar
- jaxws-api.jar
- jaxws-rt.jar
- jsp-api.jar
- management-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
- ..\docs
- ..\示例
- ..\主机管理器
- ..\经理
- ..\ROOT
- ..\com.mkyong.ws.war
更新 #5
{$Tomcat}\webapps\com.mkyong.ws 目录包含以下内容:
这是 Tomcat 管理器 GUI 的屏幕截图:
这是我收到的 HTTP 404 错误的屏幕截图以及 URL:
我还确认 WAR 中的文件与 tutorial 完全匹配。
【问题讨论】:
-
哥们请分享你得到的日志(ALL THE LOG),你正在使用windows系统右启动tomcat服务,请复制tomcat控制台消息,以便验证你的模块是否在 tomcat 启动时加载。
-
我已经使用您正在使用的相同教程参考和 jar 创建了 Web 服务。
-
谢谢,@NIKET BHANDARY。为了确保我有一个干净的 catalina.log 文件(因为我仍在尝试让它在本地基于 Windows 的 Tomcat 服务器实例上运行),我停止了服务,删除了日志,重新启动了服务,然后在 Chrome 中浏览到 localhost:1985/helloworld/hello - 仍然收到 404 错误。然后我打开了 catalina.log 文件,但它完全是空的!只有 jakarta_service.log 有任何日志条目,都是关于服务启动的。想法?
-
我刚刚在整个 Tomcat 目录中搜索了“com.mkyong”。只有 webapp WAR 文件、webapps/../META-INF/context.xml、webapps/../WEB-INF/sun-jaxws.xml 和 /conf/cataline/localhost/com.mkyong.we.xml 文件返回任何命中。任何日志中都没有。我开始认为这是配置 (web.xml) 问题?
-
@NIKETBHANDARY,我再次检查了日志,只有 jakarta_service_20150817.log 有任何消息。日志记录级别设置为 debug,那么我应该做些什么来增加日志记录吗?另外,您是否知道 Tomcat 记录 HTTP 错误消息的方法,还是没有帮助?感谢您对此的帮助。
标签: java web-services tomcat jax-ws