【问题标题】:Tomcat 8 Embedded - WebServlet - 'A child container failed during start'Tomcat 8 Embedded - WebServlet - '子容器在启动期间失败'
【发布时间】:2018-08-05 09:45:52
【问题描述】:

我有一个嵌入式 Tomcat 服务器,它可以很好地提供静态文件。但是当我添加使 @WebServlet 正常工作所需的 buildPath code 时,它在我的一个项目中不起作用(项目之间有很多差异......价值大约 50K 行)。

我在读取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 工作所必需的,如here 所述(事实上,在任何项目中,如果没有setResources,WebServlet 将无法工作。我和其他人有一些使用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 可能试图告诉我一些事情。唉,它打开了org.apache.juli.logging.Log,但什么也没写。

strace 还揭示了主 Tomcat 线程(成功)stats 在打印异常之前的以下文件:

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

尽管有所有这些活动,但它不是 stating 或以任何方式查看 WEB-INF! 事实上,没有任何名为 web.xmlpom.xml 的文件的访问权限.

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

虽然其他人已经看到 LifecycleException,但似乎这是一个新的上下文。例如,其他人已经看到了具有a more helpful exception 的不同形式的异常。还有一些人看到了类似的错误in standalone 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 的新手。

【问题讨论】:

    标签: java servlets tomcat8


    【解决方案1】:

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

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

    如果您发现某些依赖关系会产生一些冲突,您可以通过两种方式进行处理:

    1. 删除或替换依赖项(例如码头、骆驼)。
    2. 将依赖项标记为提供的,这意味着它将用于点号 1 中的 jar。

    很清楚,第二个选项可能是最好的,但有时你需要清理你的依赖关系。

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

    `<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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-24
      • 2014-01-14
      • 2014-05-30
      • 2012-05-09
      • 2014-01-17
      • 1970-01-01
      • 2017-03-19
      • 2020-01-10
      相关资源
      最近更新 更多