一个子容器在启动时失败了 java.util.concurrent.ExecutionException

30

我尝试创建/运行基本的JSP,并遇到以下错误。我看到其他人也遇到了类似的问题,但是我还没有找到(或正确实现)解决问题的方法。任何帮助都将不胜感激!

    SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/SimpleServletProject]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/SimpleServletProject]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    ... 6 more
Caused by: java.lang.NoClassDefFoundError: HttpServletRequest
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2693)
    at java.lang.Class.getDeclaredMethods(Class.java:1967)
    at org.apache.catalina.util.Introspection.getDeclaredMethods(Introspection.java:127)
    at org.apache.catalina.startup.WebAnnotationSet.loadMethodsAnnotation(WebAnnotationSet.java:287)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:140)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:65)
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:415)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:892)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5380)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: HttpServletRequest
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    ... 20 more

Jan 22, 2015 9:04:06 PM org.apache.catalina.core.ContainerBase startInternal
SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:300)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:739)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 6 more

Jan 22, 2015 9:04:06 PM org.apache.catalina.startup.Catalina start
SEVERE: The required Server component failed to start so Tomcat is unable to start.
org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:739)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 7 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 9 more
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:300)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 11 more

Jan 22, 2015 9:04:06 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-8080"]
Jan 22, 2015 9:04:06 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
Jan 22, 2015 9:04:06 PM org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
Jan 22, 2015 9:04:06 PM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-bio-8080"]
Jan 22, 2015 9:04:06 PM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["ajp-bio-8009"]

你使用的Tomcat和servlet-api版本是什么?在应用程序部署之前,容器是否正确启动?此外,请检查lib文件夹中的servlet-api - Bruno Ribeiro
1
总的来说,当将服务器特定库(如servlet-api)放置在/WEB-INF/lib文件夹中时,可能会抛出此异常java.lang.ClassNotFoundException: HttpServletRequest。您是否手动向项目添加了这些依赖项? - Tiny
14个回答

12
你必须将 servlet-api.jar 和其他库一起打包到 war 文件中。你可以通过打开 war 文件并导航到 WEB-INF/lib 文件夹来验证这一点。
理想情况下,你不应该提供 servlet-api jar 文件。在部署时,容器(如 Tomcat)会为你的应用程序提供它。如果你也试图提供它,则由于版本不匹配等问题而出现问题。最好的做法是避免打包它,从 WEB-INF/lib 中删除它。 附加信息 如果你正在使用 Maven 进行打包,则只需向依赖项添加 provided 标签,Maven 将确保在最终的 war 文件中不打包它。例如:
<dependency>
    <artifact>..
    <group> ...
    <version> ...
    <scope>provided</scope>
</<dependency>

实际上,错误已经解决了,但我遇到的问题是:Caused by: com.sun.jersey.api.MessageException: 找不到Java类com.db.conec.Track和Java类型class com.db.conec.Track以及MIME媒体类型text/plain的消息体编写器。 - Nilesh

12

我曾经遇到过类似的问题,原因是我在.java文件和web.xml文件中都写了WebServlet路径。从任意一个位置移除它,问题就能解决。

.java文件中:


在.java文件中:
@WebServlet("/index1.jsp")

并且在 web.xml 文件中

<servlet>
    <servlet-name>Logout</servlet-name>
    <servlet-class>tpc.Logout</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Logout</servlet-name>
    <url-pattern>/index1.jsp</url-pattern>
</servlet-mapping>

这对我来说是个问题。谢谢。 - Devendra Singraul

5
您的 webapp 在其 /WEB-INF/lib 目录下有 servlet-api.jar 这样的与 servlet 容器相关的库。这是不正确的。
请将它们全部删除。
/WEB-INF/lib 应该只包含特定于 webapp 的库,而不是特定于 servlet 容器的库。servlet 容器 (如 Tomcat) 应该已经提供了 servlet 容器特定的库。
如果您从不同制造/版本的任意 servlet 容器提供库,您将遇到此类问题,因为您的 webapp 将无法在与那些库不同制造/版本的 servlet 容器上运行。
如何解决: 在 Eclipse 中, 右键单击项目属性 -> Java Build Path -> 添加库 -> 服务器运行时库 -> Apache Tomcat
在 Maven 项目中:
在 pom.xml 文件中添加以下行
<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>${default.javax.servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>${default.javax.servlet.jsp.version}</version>
            <scope>provided</scope>
        </dependency>

3
好的,我会尽力完成翻译。以下是需要翻译的内容:This answer was copied from https://dev59.com/Ouo6XIcBkEYKwwoYQiO7#10556306 - dat3450

4

删除名为Servers(或包含你的server.xml的Servers1、Servers2)的项目,在Package Explorer(工作区)中找到它。

从Eclipse中移除服务器:前往窗口 > 首选项 > 服务器 > 运行环境,将你正在使用的服务器从Eclipse中删除并重新添加(这样做会在Eclipse中创建一个新的服务器项目文件夹),

从项目中移除服务器:同时也要从你的项目中移除服务器(生成路径 > 配置路径 > Java Build path)并重新添加。

现在你有了一个全新的服务器项目,它不会在其server.xml文件中拥有多个上下文,只需删除server.xml文件中重复的路径即可解决现有问题,但仍然无法启动服务器。通过这样做,Apache Tomcat v7的服务器成功启动,并正常工作。

我不知道这是否是一种良好的实践方法,我是编程的初学者。


我只是在pom.xml文件中添加和删除一些内容,然后替换回原始文件,突然我的工作区变得混乱了。但在完成这个步骤后,我设法启动了服务器...谢谢你。 - Sh4m

2

我使用Http Servlet进行尝试,当我写重复的@WebServlet时,遇到了这个问题。在删除或更改@WebServlet值后,它可以工作。

1.类

@WebServlet("/display")
public class MyFirst extends HttpServlet {

2.Class

@WebServlet("/display")
public class MySecond extends HttpServlet {

1

这是我成功的做法:

1) 将commons-logging.jar添加到WEB-INF/lib文件夹中

2) 将此jar作为Maven依赖项添加,例如将其添加到pom.xml中:

 <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
 </dependency>

3) 运行Maven安装。

4) 启动服务器。

希望能对您有所帮助。


1

检查你的JAVA_HOME是否设置为1.7或更低版本,因为Tomcat 7与JDK 1.8不兼容。

这对我有用。


0

我遇到了类似的问题,日志也很相似。我使用的是JDK 1.6和Apache Tomcat 7。将java_home设置为1.7解决了这个问题。


0

有时,这个问题是由于Java版本和Tomcat版本不兼容导致的。请选择两者兼容的版本。


0

这个问题也可能是由于损坏的Maven仓库引起的。

在使用Eclipse时,我会不时地看到SEVERE:A child container failed during start消息。我的Eclipse工作区有几个项目,其中一些项目具有共同的外部依赖项。如果Maven仓库为空(或者我将新的依赖项添加到pom.xml文件中),Eclipse会开始下载pom.xml中指定的库到Maven仓库中。而且Eclipse会同时为工作区中的几个项目进行并行下载。可能会发生几个Eclipse线程同时将同一个文件下载到Maven仓库的同一个位置。结果,该文件就会损坏。

因此,这就是您可以解决该问题的方法。

  1. 关闭你的Eclipse。
  2. 如果你知道Maven仓库中哪个特定的jar文件损坏了,那么删除该文件。
  3. 如果你不知道Maven仓库中哪个文件损坏了,那么删除整个仓库(rm -rf $HOME/.m2)。
  4. 对于每个项目,在命令行中运行mvn package。重要的是要逐个运行每个项目,而不是并行运行;这样,你可以确保每次只有一个Maven实例在运行。
  5. 打开你的Eclipse。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接