JSF+Hibernate项目升级JBoss6到WildFly15及Java6到Java8时部署失败
JBoss6→WildFly15 + Java6→Java8升级部署错误解决指南(Hibernate+JSF项目)
咱们把基于Hibernate ORM的JSF项目从JBoss6、Java6升级到WildFly15、Java8后,已经搞定了一些问题,但现在碰到了部署失败的情况,具体错误日志如下:
14:34:43,718 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC000001: 启动服务jboss.deployment.unit."nts.war".POST_MODULE失败:org.jboss.msc.service.StartException in service jboss.deployment.unit."nts.war".POST_MODULE: WFLYSRV0153: 处理部署"nts.war"的POST_MODULE阶段失败 at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:151) at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1738) at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1700) at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1558) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1364) at java.lang.Thread.run(Thread.java:745) Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServlet from [Module "deployment.nts.war" from Service Module Loader] at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.checkDeclaredApplicationClassAsServlet(JaxrsScanningProcessor.java:437) at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.scanWebDeployment(JaxrsScanningProcessor.java:278) at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.deploy(JaxrsScanningProcessor.java:109) at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:144) ... 8 more Caused by: java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServlet from [Module "deployment.nts.war" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.checkDeclaredApplicationClassAsServlet(JaxrsScanningProcessor.java:435) ... 11 more 14:35:07,319 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: 操作("deploy")失败 - 地址: ([("deployment" => "nts.war")]) - 失败描述: {"WFLYCTL0080: 失败的服务" => {"jboss.deployment.unit.\"nts.war\".POST_MODULE" => "WFLYSRV0153: 处理部署\"nts.war\"的POST_MODULE阶段失败 Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServlet from [Module \"deployment.nts.war\" from Service Module Loader] Caused by: java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServlet from [Module \"deployment.nts.war\" from Service Module Loader]"}} 14:35:07,361 INFO [org.jboss.as.server] (ServerService Thread Pool -- 43) WFLYSRV0010: 已部署"nts.war" (运行时名称: "nts.war") 14:35:07,373 INFO [org.jboss.as.controller] (Controller Boot Thread) WFLYCTL0183: 服务状态报告 WFLYCTL0186: 启动失败的服务: service jboss.deployment.unit."nts.war".POST_MODULE: WFLYSRV0153: 处理部署"nts.war"的POST_MODULE阶段失败 14:35:07,483 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: 恢复服务器 14:35:07,488 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: HTTP管理接口监听于http://127.0.0.1:9990/management 14:35:07,489 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: 管理控制台监听于http://127.0.0.1:9990 14:35:07,490 ERROR [org.jboss.as] (Controller Boot Thread) WFLYSRV0026: WildFly Full 15.0.1.Final (WildFly Core 7.0.0.Final) 已启动(存在错误),耗时70466ms - 已启动583个服务中的372个(1个服务启动失败或依赖缺失,324个服务为懒加载、被动或按需启动) 14:35:08,034 INFO [org.jboss.as.protocol] (management I/O-1) WFLYPRT0057: 通过中断线程Thread[management-handler-thread - 1,5,management-handler-thread]取消任务的内容
问题核心分析
这个错误的根源是找不到com.sun.xml.ws.transport.http.servlet.WSServlet类,背后的原因很明确:
- JBoss6默认自带了Sun/Oracle的JAX-WS实现,所以这个类在旧环境中是现成可用的;
- WildFly从版本8开始就切换到了Apache CXF作为JAX-WS的默认实现,不再包含Sun的JAX-WS类库;
- 同时Java8中JAX-WS的API虽然还保留,但具体实现已经从JDK中剥离(Java9及之后完全移除),升级后自然找不到这个类。
可行解决方案
根据项目的实际需求,可以选择以下方案之一:
方案一:引入Sun JAX-WS实现依赖
如果项目必须使用Sun的JAX-WS实现,需要把对应的依赖jar包(比如jaxws-rt.jar)添加到项目的WEB-INF/lib目录下,确保部署时类加载器能找到这个类。
方案二:切换到WildFly自带的Apache CXF实现
这是更推荐的方案,因为WildFly对CXF有原生支持,步骤如下:
- 检查项目的
web.xml,如果配置了WSServlet,将其替换为CXF对应的Servlet:org.apache.cxf.transport.servlet.CXFServlet; - 项目中使用的标准JAX-WS注解(比如
@WebService、@WebMethod等)基本都和CXF兼容,不需要大幅修改代码,只需调整少量与特定实现相关的配置即可。
方案三:移除无用的JAX-WS相关配置
如果项目根本不需要JAX-WS功能,那可以检查:
web.xml中是否有多余的JAX-WS Servlet配置,直接删除;- 项目依赖中是否有JAX-WS相关的jar包,移除这些依赖;
- 这样就能避免WildFly的JAXRS扫描器触发对
WSServlet的检查,从而解决错误。
内容的提问来源于stack exchange,提问作者Nourhan Mahmoud Zaki
相关产品推荐
相关产品推荐

