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.xml
或 pom.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,输出很多,但没有明显有用的信息。如果我对 INFO
和 SEVERE
进行 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 中的 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
。
我有一个嵌入式 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.xml
或 pom.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,输出很多,但没有明显有用的信息。如果我对 INFO
和 SEVERE
进行 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 中的 jar。
很明显,第二个选项可能是最好的,但有时您需要清理依赖项。
注意:请确保您使用的是 mvn dependency:tree
.
`<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
。