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.xml
或pom.xml
文件。
因此,涉及对web.xml
或pom.xml
更改的所有各种解决方案都无关紧要,因为Tomcat甚至在生成LifecycleException之前甚至都没有打开这些文件。
当其他人看到LifecycleException时,看起来这是一个新的上下文。 例如,其他人看到了exception的不同forms,这有一个更有用的例外 。 还有一些人在独立的Tomcat中看到了类似的错误,但他们拥有$ CATALINA日志的奢侈品。 但我还没有找到其他问题/解决方案,涉及上面这个非常模糊的嵌入式Tomcatexceptionforms。
此外,我将Java日志记录级别设置为Level.ALL,并且输出很多,但没有明显有用的信息。 如果我grep for 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嵌入式的新手。
您需要结合两种解决方案:
首先,validationmvn dependency:tree
,这可以列出与此特定jar servlet-api:jar
关联的所有依赖项。
如果您发现某些依赖性产生了一些冲突,您可以通过两种方式工作:
- 删除o替换依赖项(例如jetty,camel)。
- 标记所提供的依赖关系,这意味着将用于点编号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
。