Web项目中诡异的java.lang.ClassNotFoundException: ch.qos.lorgback.classic.PatternLayout问题解决

引言: 诡异而少见的java.lang.ClassNotFoundException: ch.qos.lorgback.classic.PatternLayout异常错误信息,在启动的时候,出现了异常,哪里出了问题呢?

1.  背景介绍

项目是Web项目,使用了slf4j-api, 使用logback做为默认的日志包;之前一直工作正常,在将日志路径调整到了pom.xml之后,忽然就蹦出来一个异常错误信息。

pom.xml中引用的maven片段:

      <dependency>
	    <artifactId>slf4j-api</artifactId>
	    <groupId>org.slf4j</groupId>
	    <version>1.7.10</version>
	</dependency>
	<dependency>
   	    <groupId>ch.qos.logback</groupId>
	    <artifactId>logback-classic</artifactId>
	    <version>1.1.3</version>
	    <exclusions>
		<exclusion>
	  	   <artifactId>slf4j-api</artifactId>
		   <groupId>org.slf4j</groupId>
		</exclusion>
	     </exclusions>
	</dependency>

2. 问题的出现

在某一天,忽然出现了以下问题,

17:03:02,893 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Fri Apr 24 17:03:02 CST 2015
17:03:02,893 |-ERROR in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Could not create component [layout] of type [ch.qos.lorgback.classic.PatternLayout] java.lang.ClassNotFoundException: ch.qos.lorgback.classic.PatternLayout
	at java.lang.ClassNotFoundException: ch.qos.lorgback.classic.PatternLayout
	at 	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
	at 	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
	at 	at ch.qos.logback.core.util.Loader.loadClass(Loader.java:125)
	at 	at ch.qos.logback.core.joran.action.NestedComplexPropertyIA.begin(NestedComplexPropertyIA.java:100)
	at 	at ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:275)
	at 	at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:147)
	at 	at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:129)
	at 	at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:50)
	at 	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:149)
	at 	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:135)
	at 	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:99)
	at 	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:49)
	at 	at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:77)
	at 	at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:152)
	at 	at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:85)
	at 	at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
	at 	at org.slf4j.LoggerFactory.bind(LoggerFactory.java:142)
	at 	at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:121)
	at 	at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:332)
	at 	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)
	at 	at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156)
	at 	at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
	at 	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:274)
	at 	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:282)
	at 	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
	at 	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
	at 	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
	at 	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at 	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at 	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at 	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at 	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at 	at java.lang.Thread.run(Thread.java:662)
17:03:02,893 |-ERROR in [email protected]:22 - no applicable action for [pattern], current ElementPath  is [[configuration][appender][layout][pattern]]
17:03:02,903 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ThirdPartyAppender] - Active log file name: /opt/app/outpay/logs/es-thirdparty.log.2015-04-24.log
17:03:02,903 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ThirdPartyAppender] - File property is set to [null]
17:03:02,903 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[ThirdPartyAppender] - Encoder has not been set. Cannot invoke its init method.

从日志上看,在Spring web context启动的过程中,需要查找默认的日志框架,结果在最终的结果中,没有找到期望的类ch.qos.lorgback.classic.PatternLayout。经过确认,这个类确实是在我们系统的类库之中,但是为什么却报没有找到的异常呢?

3. 问题的分析与解决

为什么在Spring web context的加载中报错,但是类确实是存在于系统中呢?最终的解决是加载的顺序,就是在启动web context的类库之时,类库确实无法被访问到。

回想到pom.xml中加载的类库,确实是可以被限制在不同的访问scope中的,即scope限定了在不同的时候,应用所可以访问的类库包。

maven依赖关系中Scope的作用

在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:

* compile,缺省值,适用于所有阶段,会随着项目一起发布。

* provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。

* runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。

* test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。

* system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

此时我们的系统中使用了默认值compile. 故在web容器启动的时候,无法访问到可用的类库logback.jar。 按照通常的道理和分析而言,其是适用于所有阶段的,但这里为什么不可用,无法得知。

但是将其scope设置为provided, 则强制指定其为容器所用,故可以解决当前的异常问题。

正确的设置为:

		<!-- Logger -->
		<dependency>
			<artifactId>slf4j-api</artifactId>
			<groupId>org.slf4j</groupId>
			<version>1.7.10</version>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.1.3</version>
			<exclusions>
			    <exclusion>
			       <artifactId>slf4j-api</artifactId>
			       <groupId>org.slf4j</groupId>
			   </exclusion>
			</exclusions>
			<scope>provided</scope>
		</dependency>

4.  总结

该问题的症结点在于正确的使用scope的作用域。

时间: 2024-11-05 13:28:40

Web项目中诡异的java.lang.ClassNotFoundException: ch.qos.lorgback.classic.PatternLayout问题解决的相关文章

jsp项目中连接数据库解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver的问题

报错:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 今天在做jsp连接数据库操作时,一直报加载不了驱动的错误,代码检查了很久都没错,重新导jar包也不行,最后又看了一遍同学的路径,原来是我把jar包放错了位置 ,应该放在WEB-INF中的lib下,而我放在了WEB下的lib中.然后又往里面拖了一下,成功了! then 原文地址:https://www.cnblogs.com/bibimonster/p/10392827.html

解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level

学习了:https://blog.csdn.net/yunfeng482/article/details/78106433 没想到啊:我都看见了,idea也反编不了: 没想到要重新下载啊: 原文地址:https://www.cnblogs.com/stono/p/9126417.html

idea 中 Caused by: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

idea  中 Caused by: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener 项目启动出现未知错误: 代码未错,即为idea配置问题: 解決 在IDEA中点击File > Project Structure > Artifacts > 在右侧Output Layout右击项目名,选择Put into Output Root. ?执行后,在WEB-I

【web.xml】报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

今天搭建新的项目,虽然在web.xml中配置了ContextLoaderListener以及IntrospectorCleanupListener 如下: web.xml中部分代码: 1 <!-- 监听servletContext,启动contextConfigLocation中的spring配置信息 --> 2 <listener> 3 <listener-class>org.springframework.web.context.ContextLoaderListe

已解决: idea创建并部署SpringMVC项目时 报错 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

用IDEA创建并运行SpringMVC项目时,最初发现没有Servlet包,这个问题已在上篇解决,然而当我们尝试去运行此时的SpringMVC项目时,发现仍然有错误.ClassNotFoundException 笔者也是IDEA的新手,在网上查了很多资料 有帖子说是Tomcat Server 的  VM options 没有填写,按照帖子填上这一项后,重启项目依然报错,最后终于找到了问题的原因,spring springmvc 的jar包没有导入.. 下面来解决这个问题: 现在问题解决了 原文地

maven项目使用spring报java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListe

1.Add maven dependencies  Right click the web project "properties" -------> click the "Deployment Assembly" ---->Click add button2.Choose Java Build Path Entires ---> click Next3.Choose Maven Dependencies------>  Finish 亲测可

启动Maven项目启动报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

tomcat在发布项目的时候没有同时发布maven依赖所添加的jar包,你需要设置一下eclipse:项目 -> 属性 -> Deployment Assembly -> Add -> Java Build Path Entries -> 选择Maven Dependencies -> Finish -> OK把对应的Maven依赖包也发布到tomcat,调试时会自动把那些jar发布到指定目录下,tomcat也能找到那些jar了.

maven项目 启动报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

tomcat在发布项目的时候没有同时发布maven依赖所添加的jar包,所以找不到. 解决方法:设置一下eclipse: 项目 -> properties -> Deployment Assembly -> Add -> Java Build Path Entries -> 选择Maven Dependencies -> Finish -> OK 把对应的Maven依赖包也发布到tomcat,调试时会自动把那些jar发布到指定目录下,tomcat也能找到那些jar

解决java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/Pattern

明明引入了这个,却提示没有 看下面文章: http://lib.csdn.net/article/computernetworks/16110 (3)我按照网上的方法更换了logback jar包的版本,由1.0.9改成了1.0.11,问题并没有解决,又尝试了几个版本,依旧无解:其实在想到是jar包冲突的时候,我尝试着用exclusion不引入第三方的logback依赖,如下: <exclusion> <groupId>ch.qos.logback</groupId>