Tomcat 8 Embedded – WebServlet – ‘启动时子容器失败’

我有一个嵌入式Tomcat服务器正在提供静态文件。 但是当我添加使@WebServlet工作所需的buildPath代码时,它在我的一个项目中不起作用(项目之间存在很多差异……大约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工作,如此处所述(事实上,在任何项目中,没有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还会在打印exception之前显示主要的Tomcat线程(成功) stat以下文件:

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

尽管所有这些活动,它都没有以任何方式stat或查看WEB-INF! 实际上,不能访问任何名为web.xmlpom.xml文件。

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

当其他人看到LifecycleException时,看起来这是一个新的上下文。 例如,其他人看到了exception的不同forms,这有一个更有用的例外 。 还有一些人在独立的Tomcat中看到了类似的错误,但他们拥有$ CATALINA日志的奢侈品。 但我还没有找到其他问题/解决方案,涉及上面这个非常模糊的嵌入式Tomcatexceptionforms。

此外,我将Java日志记录级别设置为Level.ALL,并且输出很多,但没有明显有用的信息。 如果我grep for 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嵌入式的新手。

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

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

如果您发现某些依赖性产生了一些冲突,您可以通过两种方式工作:

  1. 删除o替换依赖项(例如jetty,camel)。
  2. 标记所提供的依赖关系,这意味着将用于点编号1中的jar。

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

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

 ` javax.servlet javax.servlet-api 3.0.1 provided ` 

mvn dependency:tree应该产生:

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

这只是一种exception,可以在容器内产生jar冲突,在本例中为servlet-api.jar