【发布时间】: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.xml 或 pom.xml 的文件的访问权限.
因此,所有涉及更改 web.xml 或 pom.xml 的各种解决方案都无关紧要,因为 Tomcat 在生成 LifecycleException 之前甚至不会打开这些文件。
虽然其他人已经看到 LifecycleException,但似乎这是一个新的上下文。例如,其他人已经看到了具有a more helpful exception 的不同形式的异常。还有一些人看到了类似的错误in standalone Tomcat,但他们拥有 $CATALINA 日志的奢侈。 但我还没有找到涉及上述问题的其他问题/解决方案,嵌入式Tomcat中异常的非常模糊的形式。
此外,我将 Java 日志记录级别设置为 Level.ALL,并且有很多输出,但没有明显有用的信息。如果我 grep 为 INFO 和 SEVERE 我得到:
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 的新手。
【问题讨论】: