Tomcat启动异常:A child container failed during start 与 ClassNotFoundException: org.slf4j.Loggerl分析与解决方法

Tomcat启动异常:A child container failed during start 与 ClassNotFoundException: org.slf4j.Logger 分析与解决方法

 

问题描述1:tomcat启动报错,A child container failed during start.

问题描述2:tomcat启动报错,java.lang.ClassNotFoundException: org.slf4j.Logger,包都在就是找不到...

背景前提:Eclipse环境下,当你导入一个maven项目后,发现在tomcat中运行报错,且jdk、tomcat都是配置正确。那出错的原因是什么呢?(报如下错误的一般都是maven项目)。

异常信息:

严重: A child container failed during start

java.util.concurrent.ExecutionExceptionorg.apache.catalina.LifecycleException:  

Failed to start component [StandardEngine[Catalina].StandardHost[localhost]. 

StandardContext[/patyee]]

    at java.util.concurrent.FutureTask.report(FutureTask.java:122)

    at java.util.concurrent.FutureTask.get(FutureTask.java:192)

......

    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[/patyee]]

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)

    ... 6 more

Caused by: java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;

    at java.lang.Class.getDeclaredFields0(Native Method)

    at java.lang.Class.privateGetDeclaredFields(Class.java:2583)

    at java.lang.Class.getDeclaredFields(Class.java:1916)

......

    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)

    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5405)

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

    ... 6 more

Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger

    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1854)

    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1703)

    ... 20 more

七月 17, 2017 10:42:49 上午 org.apache.catalina.core.ContainerBase startInternal

严重: A child container failed during start

java.util.concurrent.ExecutionExceptionorg.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.StandardService.startInternal(StandardService.java:443)

     ......

    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)

    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)

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:1574)

    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)

    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:1130)

    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:819)

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

    ... 6 more

七月 17, 2017 10:42:49 上午 org.apache.catalina.startup.Catalina start

严重: 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:498)

    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)

    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)

......

 

分析:先检查项目的配置是否都正确. 

一、【配置项目属性】项目右键--->properties

① 先检查Java Build Path

 

 

②检查Java Compiler

 

③检查Project Facets中的Java等级,与tomcat配置。

在搜索框中,搜索facet

 

 二、【全局tomcat配置】Window ---> Preferencs ---> Server --->Runtime Environments

④检查tomcat配置

 

 

到此为止,如果你发现你上面的配置都是正确的(主要是jdk版本要一致,包括tomcat的jdk),但是还是报错,那是什么原因呢?

 

我们先来看一下报错的信息:

严重: A child container failed during start 

java.util.concurrent.ExecutionExceptionorg.apache.catalina.LifecycleException: Failed to start component  [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/patyee]]

 

A child container failed during start   意思是说“启动一个子容器失败”。

那么这个子容器指的是什么?

其实这个子容器指的是你部署项目的tomcat,双击tomcat你会看见tomcat的配置。

 

 

Server Locations:(默认选择第一项Use workspace metadata(does not modidy Tomcat installation))就是我们部署项目用的tomcat的位置,它的本质是我们在本地安装的一个tomcat的一个副本(默认复制了本地的tomcat到Eclipse的工作空间的文件夹里来)这里的配置不要改动,使用tomcat的副本进行项目部署,不会改变我们本地安装的tomcat的配置。可以单独在副本里进行各种修改。

-------------------------------------------

普及一下tomcat在Eclipse中的配置知识:

(关于Eclipse中tomcat的配置,路径的选择的区别,我会再写一篇详细的文章。)

比如我本地tomcat安装在D盘:

D:\apache-tomcat-7.0.65

但是我们项目部署的地方,却不是在D盘,而是在Eclipse的工作空间中,

具体路径为:

D:\Workspaces\eclipse_luna\.metadata\.plugins\org.eclipse.wst.server.core

这里面有很多tmp, 这些就是Eclipse自动为我们copy的一个tomcat副本。

 

我们点击tmp5进去看看:

D:\Workspaces\eclipse_luna\.metadata\.plugins\org.eclipse.wst.server.core\tmp5

 

再看看本地的tomcat:

D:\apache-tomcat-7.0.65

 

 其实可以发现两个文件夹里的内容基本一样,其本质:tmp5就是D盘D:\apache-tomcat-7.0.65的一个副本,称之为子容器”。

-----------------------------------------

版权声明:本文为博主(chunlynn)原创文章,转载请注明出处 https://blog.youkuaiyun.com/chenchunlin526/article/details/75229006

我们的项目就部署在这里:

D:\Workspaces\eclipse_luna\.metadata\.plugins\org.eclipse.wst.server.core\tmp5\wtpwebapps\patyee

jar包在这里:

D:\Workspaces\eclipse_luna\.metadata\.plugins\org.eclipse.wst.server.core\tmp5\wtpwebapps\patyee\WEB-INF\lib


 这里面的jar包只有13个,全都是项目WEB-INF/lib目录下已有的。

 

启动子容器失败,指的就是启动tmp5这个tomcat容器失败。

然后报错信息中有一句Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger

说是找不到类,貌似是缺少slf4j的jar包。

 

哈哈,现在进入异常的解决方案:

我查看一下是否少了slf4j的jar包:

 

maven库中并没有少啊!

那是什么鬼呢??

实际上报这个错的,肯定是Eclipse+tomcat+maven项目,强调一遍,肯定是Maven项目

解决方法如下:

项目右键 ---> properties

Deployment Assembly设置【web部署部件】:

 

 

 

 

把maven库中的jar包添加到项目部署部件中。

至此问题解决!前面说那么多,主要为了“授之以渔”。不只是告诉你解决方案,而是告诉你怎么分析!

你在maven中管理jar包,但是你用tomcat运行项目时,maven本地库中的jar包并没有发布到tomcat容器中。所以你在项目的发布目录的WEB-INF/lib下,是找不到托管在maven中的jar包的。通过上面的Deployment Assembly设置后,启动tomcat,重新进入到tmp5中进行查看,WEB-INF/lib中已经包含了81个jar包,而这些jar包,除了那13个,其余的都是是我们在pom.xml,即maven中托管的jar包,现在已经全部发布到tomcat容器了,这样tomcat就正常启动了。

 

------------------------------------------------------

再普及一个知识:Eclipse的WebContent目录,或者MyEclipse的WebRoot目录就是项目发布输出的最终目录。当项目发布到tomcat后,WebContent 会更名为项目名,里面包含静态文件以及.java被编译成字节码的.class文件。

编译后的Java文件在这里,编译后.java文件全都变成字节码文件(.class)了。

 

 

希望对各位有所帮助!嘿嘿,朋友你也可以扫描如下二维码赞赏一下哈,多少随意,谢谢哈,并可“留言”留下联系方式加我QQ或微信~~~

-----------------------------补充一个其他网友遇到的相似的异常信息的解决方案----------------------------

问题描述3:tomcat启动报错,报:A child container failed during start ,并且异常信息包含有 Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> * in servlet mapping 

原因:已经发布到tomcat上的某个项目的servlet过滤器配置错误。
如在web.xml下,将过滤规则定为“*”就是一种错误,需要更正为“/*”或者其他(但是必须要有“/”开头,表示当前项目),配置为:<url-pattern>/*</url-pattern>  。

该异常主要是你的web.xml中过滤的规则配置出错了,与我上面的那个异常不同。

希望对各位有所帮助!

版权声明:本文为博主(chunlynn)原创文章,转载请注明出处 https://blog.youkuaiyun.com/chenchunlin526/article/details/75229006

---------------------

推荐:必读书籍《深入剖析Tomcat

下载地址:[免费]《深入剖析Tomcat》高清PDF完整版(353页)-优快云下载  http://download.youkuaiyun.com/detail/chenchunlin526/9902236

<think>嗯,用户遇到了Tomcat7启动时出现ClassNotFoundException,具体是缺少SLF4JBridgeHandler类。首先,我需要回忆一下这个类属于哪个依赖库。SLF4J相关的桥接类通常出现在slf4j-jdk14或者类似的桥接器中。可能用户的项目中没有正确引入这个依赖。 根据用户提供的其他引用,比如引用[2]中提到了log4j的依赖,可能用户的项目中使用了不同的日志框架,但缺少桥接器。SLF4JBridgeHandler的作用可能是将其他日志系统的日志转到SLF4J,所以需要检查依赖是否存在冲突或者缺失。 另外,引用[3]中提到添加jpa依赖解决了类找不到的问题,这说明有时候缺少的类可能属于某个特定的starter或模块。因此,用户可能需要添加slf4j的桥接依赖,例如slf4j-jdk14或者log4j-over-slf4j,具体要看项目的日志框架配置。 用户可能没有在pom.xml或build.gradle中添加正确的依赖。需要确认是否添加了org.slf4j:jcl-over-slf4j或者类似桥接器的依赖。另外,版本兼容性也是一个问题,比如Tomcat7可能对某些高版本的SLF4J库支持不好,需要选择适合的版本。 也有可能项目中存在多个版本的SLF4J库,导致冲突。这时候需要排除掉冲突的依赖,然后引入正确的版本。例如,使用Maven的exclusion标签来排除旧版本,再添加所需的桥接器依赖。 最后,建议用户检查依赖树,使用mvn dependency:tree或gradle dependencies命令来查看依赖情况,确认是否有冲突或缺失,并确保所有必要的桥接库都被正确引入。</think>### 解决Tomcat7启动时缺少`SLF4JBridgeHandler`类的问题 #### 问题分析Tomcat7启动时报错`java.lang.ClassNotFoundException: org.slf4j.bridge.SLF4JBridgeHandler`,通常是因为缺少SLF4J其他日志框架的桥接依赖。`SLF4JBridgeHandler`用于将Java Util Logging(JUL)的日志路由到SLF4J实现中[^2]。 --- #### 逐步解决方案 1. **添加SLF4J桥接依赖** 在项目的`pom.xml`中添加以下依赖,以引入`slf4j-jdk14`桥接库: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.7.36</version> <!-- 根据实际版本调整 --> </dependency> ``` 2. **确保SLF4J核心库存在** 检查是否已包含SLF4J的核心依赖(如Logback或Log4j2的实现): ```xml <!-- 示例:Logback作为SLF4J的实现 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> ``` 3. **初始化日志桥接** 在代码中静态加载桥接器(仅需一次): ```java import org.slf4j.bridge.SLF4JBridgeHandler; public class Main { static { SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); } // 其他代码 } ``` 4. **排除冲突的依赖** 使用Maven排除其他日志框架的冲突依赖(如commons-logging): ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> ``` --- #### 验证步骤 1. 执行`mvn clean install`重新构建项目 2. 检查依赖树:`mvn dependency:tree | grep slf4j` 3. 确认控制台输出的日志格式是否统一 ---
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值