【问题标题】:Tomcat failing to deploy .warTomcat 无法部署 .war
【发布时间】:2012-12-05 02:46:19
【问题描述】:

我正在尝试按照this 教程创建一个简单的 REST Web 服务,但是我将它部署到 tomcat 上并引发异常:

FAIL - Application at context path /restful could not be started
FAIL - Encountered exception org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/restful]]

我四处寻找解决方案,发现了这个 question 和这个 one,他们让我认为这是一个 servlet 映射问题,但我不知道如何解决它!

这是我的日志文件:

18/12/2012 9:57:16 AM org.apache.catalina.startup.HostConfig deployWAR
SEVERE: Error deploying web application archive /opt/tomcat7/webapps/restful.war
java.lang.IllegalStateException: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/restful]]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1655)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)

这是我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://java.sun.com/xml/ns/javaee" version="3.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <servlet>
    <servlet-name>RestfulContainer</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.mcnz.ws</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>RestfulContainer</servlet-name>
    <url-pattern>/resources/*</url-pattern>
  </servlet-mapping>    

</web-app>

冒着给你太多信息的风险,这里是我的文件夹结构的 ls:

.:
WEB-INF

./WEB-INF:
classes
lib
web.xml

./WEB-INF/classes:
com

./WEB-INF/classes/com:
mcnz

./WEB-INF/classes/com/mcnz:
ws

./WEB-INF/classes/com/mcnz/ws:
HelloWorldResource.class
HelloWorldResource.java

./WEB-INF/lib:
asm-3.1.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
jersey-client-1.16.jar
jersey-core-1.16.jar
jersey-json-1.16.jar
jersey-server-1.16.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar

【问题讨论】:

  • 这是一个类似的帖子 - *.com/questions/8512588/…
  • 是的,我知道我在我的问题"I've looked around for a solution and found this question". 中发布了我只是不确定这是否是 a) servlet 问题和 b) 我需要做些什么来解决它
  • 抱歉,没有点击您发布的链接。无论如何,这听起来很像 web.xml 中的问题。如果我是你,我会尝试以下方法... 从 web.xml 中取出 servlet 和 servlet-mapping 元素。重新部署,看看你是否得到同样的错误。如果没有,那么您对根本原因有更好的了解。您可能还想验证 com/sun/jersey/spi/container/servlet/ServletContainer.class 是否存在于您的 WEB-INF/lib 文件夹中的一个 jar 文件中(从 jersey-server-1.16.jar 开始)。
  • 我检查了每个罐子并寻找com/sun/jersey/spi/container/servlet/ServletContainer.class,但在任何地方都找不到。所以我找到了 jar 文件 jersey-servlet.jar 并将其添加到我的库中,现在一切正常。谢谢大家!!

标签: java rest tomcat war illegalstateexception


【解决方案1】:

正如上面的评论所示,问题原来是应用程序 web.xml 在 servlet 定义中引用了一个 java 类。通过确保应用程序实际包含该类,该问题得到了纠正。找到丢失的 jar 文件并将其放在 WEB-INF/lib 目录中。

【讨论】:

    【解决方案2】:

    在 Apache Tomcat/8.5.38 上运行 ncwms 时遇到了类似的问题 显然我现在需要添加一些在最新 Java 版本中被删除的额外 Java 库。

    (详见此处:How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9

    更改在此文件中: /opt/tomcat/bin/catalina.sh

    JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS --add-modules java.xml.bind"
    

    但对于 ncwms 来说,这还不够。后来导入数据集时遇到问题,所以我恢复到不同版本的java:

    java -version
    openjdk version "1.8.0_191"
    OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
    OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
    

    【讨论】: