当前位置: 首页 > 面试题库 >

Tomcat 8 Embedded-WebServlet-'子容器在启动期间失败'

韦绍晖
2023-03-14
问题内容

我有一个嵌入式Tomcat服务器,可以 很好地提供静态文件。
但是,当我添加开始工作所需的buildPath代码时@WebServlet,它在我的一个项目中不起作用(项目之间存在很多差异……价值约5万行)。

web.xml读取之前,我收到以下错误(我从中知道strace -ff)。

org.apache.catalina.LifecycleException: Failed to start component [StandardServer[-1]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:367)
    at app.http.TomcatServer.startTomcat(TomcatServer.java:87)
    at app.main.MainTools.startServer(MainTools.java:277)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Tomcat]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 4 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 6 more
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:947)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 8 more

似乎是由以下行引起的:

ctx.setResources(resources);

这是需要做@WebServlet的工作,如所描述这里(实际上,WebServlet确实没有不工作setResources,在任何项目中,我和其他人使用的一些工作项目setResources)。

strace 显示Tomcat正在META-INF中寻找一些文件:

META-INF/services/java.nio.channels.spi.SelectorProvider
META-INF/services/javax.xml.parsers.SAXParserFactory
META-INF/services/org.apache.juli.logging.Log

虽然我没有这些文件,但我还有一个工作项目,其中没有这些文件,因此显然不需要它们。我尝试创建该日志文件,因为看起来Juli似乎想告诉我一些事情。las,它打开了,org.apache.juli.logging.Log但是什么都没写。

strace还显示了stat在打印异常之前,Tomcat主线程成功地包含了以下文件:

org/apache/catalina/core/ContainerBase$StartChild.class

尽管进行了所有这些活动,但它并没有stat以任何方式进入或查看WEB-
INF!
实际上,无法访问任何名为web.xml或的文件pom.xml

因此所有涉及更改web.xml或pom.xml无关的各种解决方案都是不相关的,因为Tomcat甚至在生成LifecycleException之前都不会打开这些文件。

当其他人看到LifecycleException时,这似乎是一个新的上下文。例如,其他人看到了另一种形式的异常,它具有更有用的异常。还有一些人在独立的Tomcat中看到了类似的错误,但是它们拥有$
CATALINA日志的功能。 但是我还没有发现涉及嵌入式Tomcat中上述非常模糊形式的异常的其他问题/解决方案。

另外,我将Java日志记录级别设置为Level.ALL,并且有很多输出,但是没有明显有用的信息。如果我使用grep INFOSEVERE得到:

2018.02.26 10:25:39.226 INFO: Initializing ProtocolHandler ["http-nio-8081"]
2018.02.26 10:25:39.241 INFO: Using a shared selector for servlet write/read
2018.02.26 10:25:39.249 INFO: Starting service [Tomcat]
2018.02.26 10:25:39.250 INFO: Starting Servlet Engine: Apache Tomcat/8.5.24
2018.02.26 10:25:39.309 SEVERE: A child container failed during start
2018.02.26 10:25:39.309 SEVERE: A child container failed during start
2018.02.26 10:25:39.312 SEVERE: Failed to start component [StandardServer[-1]]
2018.02.26 10:25:43.485 INFO: Starting shutdown.
2018.02.26 10:25:43.486 INFO: Starting shutdown.

是否有某种方法可以使我更好地进行日志记录,或者在Tomcat中调用某些方法使其告诉我所有试图执行的所有.jar等内容?

请帮忙。我是Tomcat嵌入式的新手。


问题答案:

您需要结合两种解决方案:

首先,验证mvn dependency:tree,它可以列出您与此特定jar相关联的所有依赖项servlet-api:jar

如果发现某些依赖关系会产生冲突,则可以通过两种方式工作:

  1. 删除o替换依赖项(例如码头,骆驼)。
  2. 像提供的那样标记依赖项,这意味着将在点1中将其用于jar。

非常清楚,第二个选项可能是最好的,但是有时您需要清理依赖项。

注意:请确保您使用的是正确的版本和ID列出的依赖项 mvn dependency:tree

`<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
</dependency>`

mvn dependency:tree应产生:

`+- javax.servlet:javax.servlet-api:jar:3.0.1:provided (scope not updated to 
compile)`

在这种情况下,这仅是一种会在容器内部产生jar冲突的异常servlet-api.jar



 类似资料:
  • 在读取之前,我就会出现以下错误(我从中知道这一点)。 貌似是这句台词引起的: 这是使工作所需的,如本文所述(实际上,WebServlet在任何项目中没有就无法工作。我和其他人有一些使用的工作项目)。 虽然我没有这些文件,但我也有一个工作项目没有这些文件,所以它们显然不是必需的。我试着创建那个日志文件,因为它看起来像是Juli想告诉我什么。唉,它打开了,但没有向其中写入任何内容。 还显示,在打印异常

  • 问题内容: 我遇到错误了; 问题答案: 错误是 看来您有一个指的是您尚未声明的。 您需要具有以下声明

  • 我试图在Tomcat9中加载maven项目,显示启动期间一个子容器失败 这是我的pom。XMLI包括数据库jdbc和mysql依赖项以及HibernateSpring详细信息 我也用Spring来配置 这是我的maven Spring配置xml,包括db详细信息,db连接正常工作 当我添加连接tomcat的所有相关细节时,它正在停止并出错

  • 我有一个Ubuntu Xenial容器,在我的Arch Linux计算机上安装了amd64体系结构。容器工作正常。但是,当我第二次尝试启动容器时,出现以下错误: 容器启动失败。 要获得更多详细信息,请在前台模式下运行容器。 其他信息可以通过设置--logfile和--log优先级选项获得。 是什么原因造成的? 在使用-F、-logfile和--logpriority选项运行后得到了这个。 lxc开

  • 我正在开发一个多模块的maven项目,我想在Tomcat7中运行我的web项目,但我出现了这样的错误:“启动期间一个子容器失败”。 我继续操作:(右键单击web项目)->运行为->运行配置->goal:tomcat7:run,我有以下日志: 这是我的web.xml: 拜托,我需要你的帮助。

  • 我在我的eclipse中安装了Apache tomcat 7。我创建了一个服务器并启动它,它工作正常。当我尝试运行任何项目时,即使是一个简单的JSP hello world文件,也会发生以下错误。 例如:我用一个“index.jsp”创建了一个web动态项目,但是这个问题出现了,我不知道如何解决它。 严重:在启动java.util.concurrent期间,子容器失败。ExecutionExcep