Tomcat 8 嵌入式 - WebServlet - 'A child container failed during start'

Tomcat 8 Embedded - WebServlet - 'A child container failed during start'

我有一个嵌入式 Tomcat 服务器,它 可以很好地提供静态文件。 但是当我添加获得 [=17= 所需的 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 可能想告诉我一些事情。 las,它打开了 org.apache.juli.logging.Log 但没有写入任何内容。

strace 还显示主 Tomcat 线程(成功)stat 在打印异常之前有以下文件:

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

尽管所有这些 activity,它并不是 stat 以任何方式查看或查看 WEB-INF! 事实上,没有任何访问权限到任何名为 web.xmlpom.xml.

的文件

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

虽然其他人已经看到了 LifecycleException,但这似乎是一个新的上下文。例如,其他人看到了具有 a more helpful exception. Still others are seeing a similar error in standalone Tomcat 的不同形式的异常,但他们拥有 $CATALINA 日志的奢侈。 但是我还没有发现其他的questions/solutions涉及到上面的,很模糊的异常形式在embedded Tomcat.

此外,我将 Java 日志记录级别设置为 Level.ALL,输出很多,但没有明显有用的信息。如果我对 INFOSEVERE 进行 grep,我会得到:

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. 删除或替换依赖项(例如码头、骆驼)。
  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