java.lang.ClassNotFoundException web项目加载时找不到类

来源:互联网 发布:listview数据更新 编辑:程序博客网 时间:2024/05/29 23:24

1.概述

作为一个屌丝程序猿,怎么能不会配置log4j呢,这样在控制台或者日志文件中很容易找到程序出BUG的地方。尤其是在控制台输出日志的时候,那叫一个爽啊!

=-=  但是出现了问题,我擦,启动web的时候spring创建上下文的时候居然会找不到类,我去,检查了一下jar包,spring.jar   spring-web.jar 都有啊,怎么会找不到呢,我的jar包是放在web-inf/lib 下的,要是这样都找不到的话,你要闹哪样!

于是急忙网上搜罗了一下,大多人犯得错误就是,直接通过build path去添加的jar包,这样会导致web启动的时候java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

    为什么会同时出现这两种错误呢?是应为加载初始化log4j的时候需要使用spring的上下文,由于找不到ContextLoaderListener,所以没办法去初始化加载log4j。于是想到是不是因为没有这个ContextLoaderListener类的jar包啊。感觉看到了光明似的,但是一查看发现,我去,有啊,有这个包啊!这我就顿时无语了。

    换了个思路,实在不行,俺就新建个项目,然后把所有的东西都搬迁到新项目中,clean了一下项目,clean一下tomcat,最后发布了一下!T(太)M(萌)D(了)!居然好使了,你们说我能说啥呢?

    虽然我的这种解决之道,很无奈,别说科学,甚至连神学都解释不了。没有办法,Java这东西,大家都懂得,头天晚上有问题,回家睡一觉,第二天上班居然好了。这尼玛社么逻辑!没有办法,借此在这里吐槽一下。

对于这类问题的规避,还是建议,大家操作的时候要谨慎,不要什么东西都往项目里面添加,一定要了解你添加的jar包,你需要什么jar包,就添加什么jar包。有时间后添加多了未必有好处。对,你猜对了,jar包冲突也是屌丝程序猿的必修课。

2.解决办法

我就简单的总结一下,这种问题的解决方法:

2.1 缺少jar包

对!如果出现ClassNotFoundException这个错误,你第一反应就是,缺少jar包,说明你还是个合格的程序猿。一般出现这中情况,50%是出现了缺少jar包的问题。
你就可以去调戏一下度娘,问一下,为嘛没有jar包,缺少了什么jar包。

 2.2 jar包的位置导入有问题

我们知道在导入我们自己定义或者封装的jar包是一般是通过build  path 来添加一个jar包,但是当我们用这种方法
导入第三方提供的jar时,web project启动时会出现这种找
不到jar的情况。所以此时你需要手动将需要的jar放到web-inf/lib下,然后clean一下项目,重新发布一下,就OK了。

2.3 jar包冲突

有一部分情况会因为jar包冲突或者jar包的版本不对出现问题。刚出现这个问题的时候,我也以为是版本不对发生了冲突,到官网一看,全是最新的jar包啊,应该不存在冲突!

2.4 其他的情况

应对这种位置的情况,胆寒啊,有木有!最好的方法就是尝试,clean一下项目,重新发布一下。不行的话重启一下机器(当然这个不用担心服务器上,因为服务器上是没有eclipse环境的,有的问题在本地开发的时候会碰到而且不好解决的时候,有时候在服务器上确实好用的)。如果再不行的话,最好的办法就是新建项目,将文件逐个迁移到项目中。在重新搞一下就OK了!
什么!还没搞定,那最后一招了,找你们项目经理或者有经验的同事帮助吧!

3 Java加载顺序

Java虚拟机是根据Java ClassLoader(类加载器)决定如何加载Class。
系统默认提供了3个ClassLoader 
Root ClassLoader,ClassPath Loader,Ext ClassLoader
我们也可以编写自己的ClassLoader,去加载特定环境下的Jar文件。 
能不能加载Jar,加载哪里的Jar,是由ClassLoader决定的。 
问题可能是 导入的仅仅是jar包的引用,例如在eclipse中通过build path加进user lib……(类似快捷方式)
这种在Java Application中没问题,但在web Application中可能会出现找不到类的异常。
在WEB Application中jar包最好放在webroot或webcontent下的lib文件夹内,特别是xml中用到的jar包。

4 log4j的配置

既然牵扯到log4j怎么能不讲它的配置方法搞清楚呢。网上版本众多,当然你也可以去重新那些加载时的init方法,这里推荐的是通过web.xml,使用默认的类加载方式去初始化log4j,比较原生态。web.xml如下:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <welcome-file-list>    <welcome-file>login.jsp</welcome-file>  </welcome-file-list>  <display-name>springMVC</display-name>  <servlet>    <servlet-name>spring</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>spring</servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping>  <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:config/spring/applicationContext.xml</param-value>  </context-param>    <!-- log4j配置 --> <context-param>      <param-name>log4jConfigLocation</param-name>      <param-value>classpath:config/properties/log4j.properties</param-value>  </context-param>    <!-- log4j监听器 --><listener>      <listener-class>          org.springframework.web.util.Log4jConfigListener      </listener-class>  </listener>  <span style="font-family: Arial, Helvetica, sans-serif;"></web-app></span>

对了从上面可以看出我的路径实在src下的config/properties/log4j.properties中

log4j.properties 文件如下
 ### set log levels ###log4j.rootLogger = debug ,  stdout ,  D ,  E### 输出到控制台 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n### 输出到日志文件 ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 保存异常信息到单独文件 ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/error.log ## 异常日志文件名log4j.appender.D.Append = truelog4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
如果想看详细的配置讲解请访问:http://blog.csdn.net/azheng270/article/details/2173430/             这里我就不做赘述了。这篇博客有个错误的地方就是
<span style="font-size:18px;">log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n     1的左右是没有空格的,否则会报错</span>


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 北京办理健康证怎么办 北京的健康证怎么办 健康证丢了怎么办 健康证吃宵夜怎么办 合肥办健康证怎么办 个人办理健康证怎么办 身份证丢失怎么办健康证 个人怎么办武汉健康证 山海关古御壹号怎么办房本? 车玻璃被炮烧了怎么办 奔驰钥匙没电怎么办 婚内买的车离婚怎么办 离心风机噪音大怎么办 匹凸匹被st五牛怎么办 考不进去中学怎么办 教师体检来例假怎么办 老板拖欠农民工工资怎么办 公司破产拖欠员工工资怎么办 白玉蜗牛下蛋了怎么办 黄牛卖不出的票怎么办 鸡受风寒不产蛋怎么办 蛋鸡感冒不下蛋怎么办 牛肉煮老了怎么办 牛肉炖碎了怎么办 比值审敛法等于1怎么办 华为手机停止运行怎么办 易事通卡怎么办延期 三星手机照相机故障怎么办 凌晨一点到机场怎么办 凌晨3点醒来怎么办 凌晨四五点咳嗽怎么办 凌晨4点大便怎么办 熊猫小课付了费怎么办 华为手机系统升级后卡机怎么办 孕妇汗脚脚臭怎么办 巴基斯坦留学生丢失护照怎么办 vivox20耳机进水了怎么办 轴圆齿之间间隙大怎么办 浩辰cad2017保存不了怎么办 会议无poster版块怎么办 大四考研失败了怎么办