【发布时间】:2019-01-31 06:15:11
【问题描述】:
我正在尝试将 Spring Boot 应用程序部署到 EAP 7 服务器。该应用程序使用 Spring Boot 的嵌入式 tomcat servlet 作为独立应用程序可以正常工作,但是当我尝试将其作为 WAR 部署到 EAP 7 时,出现以下异常:
14:55:11,156 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 70) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host."projectName": org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host."projectName": java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager
at org.apache.tomcat.websocket.WsWebSocketContainer.<clinit>(WsWebSocketContainer.java:78)
at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131)
at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47)
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:184)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
... 6 more
Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.util.res.StringManager from [Module "deployment.projectName.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:196)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
... 12 more
14:55:11,156 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "projectName.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.undertow.deployment.default-server.default-host.\"projectName"" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host.\"projectName": java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager
Caused by: java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager
Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.util.res.StringManager from [Module \"deployment.projectName.war:main\" from Service Module Loader]"}}
14:55:11,187 INFO [org.jboss.as.server] (ServerService Thread Pool -- 37)
14:55:11,249 INFO [org.jboss.as.controller] (Controller Boot Thread) WFLYCTL0183: Service status report
WFLYCTL0186: Services which failed to start: service jboss.undertow.deployment.default-server.default-host."projectName": org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host."projectName": java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager
从 jar 文件转换为 war 时,我已按照 spring-boot documentation 的建议完成。
具体来说,我已经声明了对 spring-boot-starter-web 的依赖,不包括 tomcat:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
我还导入了 spring-boot-dependencies pom:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
我还向 spring-boot-starter-undertow 添加了一个依赖项,其范围为提供:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
<scope>provided</scope>
</dependency>
我删除了spring-boot-maven-plugin,并使用SpringBootServletInitializer 覆盖扩展了我的应用程序类
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
我不明白为什么它不起作用,所以非常感谢任何帮助。
【问题讨论】:
-
您收到的错误消息中只包含一行?你能从整个错误中看出为什么你对 StringManager 有依赖吗?
-
@Kenster 我添加了整个错误消息,尽管我之前的问题似乎是主要问题。
-
异常似乎是 undertow 的失败。你试过没有undertow依赖吗?它看起来像另一个嵌入式容器,您不需要嵌入式容器,因为 jboss 提供了它。我们有几个部署到 EAP 6.4 的 spring-boot 大战,它们没有任何嵌入式容器。它们依赖于 s-b-starter-web 并排除 s-b-starter-tomcat。
-
@Kenster 感谢您的建议,不幸的是我刚刚尝试过,它仍然给出了同样的错误。奇怪的是,我有另一个项目是 eap 7 上的 spring-boot 并且工作正常。两者在配置方面甚至没有那么不同
-
在我看来,spring boot 和 EAP.. yikes.. 为什么?