Tomcat无法部署.war文件

21

我试图按照 这个 创建简单 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]]

我已经寻找解决方案并找到了这个问题和这个问题,它们让我觉得这是一个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>

冒着给你们提供过多信息的风险,这里是我的文件夹结构列表:

.:
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

这里有一个类似的帖子 - https://dev59.com/9Goy5IYBdhLWcg3wfeIR - EJK
1
是的,我知道,因为我在我的问题中发布了“我已经寻找解决方案并找到了这个问题”。我只是不确定它是否是a)一个servlet问题和b)我需要做什么来修复它。 - Pete
1
抱歉,我没有跟进你发布的链接。不管怎样,这听起来非常像是web.xml中的问题。如果我是你,我会尝试以下步骤...将servlet和servlet-mapping元素从web.xml中取出。重新部署并查看是否出现相同的错误。如果没有,那么您就有了更好的根本原因的想法。您还可以验证com/sun/jersey/spi/container/servlet/ServletContainer.class是否存在于WEB-INF/lib文件夹中的一个jar文件中(从jersey-server-1.16.jar开始)。 - EJK
我逐个检查了每个jar文件,寻找com/sun/jersey/spi/container/servlet/ServletContainer.class,但无论如何都找不到。因此,我找到了jersey-servlet.jar这个jar文件,并将其添加到我的lib中,现在所有的都正常工作了。非常感谢! - Pete
2个回答

13

如上述评论所示,问题最终被发现是应用程序web.xml在servlet定义中引用了一个Java类。通过确保应用程序实际包含该类来解决了这个问题。缺失的jar文件被找到并放置在WEB-INF/lib目录下。


0
我在使用Apache Tomcat/8.5.38时遇到了与ncwms运行类似的问题,显然我现在需要添加一些在最新Java版本中删除的额外Java库。
(详见此处:如何解决Java 9中的java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
更改发生在这个文件中: /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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接