Java Web导入 commons-beanutils.jar包后仍找不到类的原因与Tomcat类加载机制的关系

看了许久的基础书籍之后决定实际开发java web项目,于是就按着网上的教程先跟着回顾了Java web项目的开发过程以及jsp+servlet+tomcat的基本操作。本以为基础很牢固了,上层操作应该很快就能学会,但是事实证明,只有理论没有实践的学习只是纸上谈兵,经验和理论有着同等的重要性。

比如今天碰到的一个问题:

在开发登陆模块功能时需要用到 commons-beanutils.jar包,于是就随便从网上下载了一个,buildpath到了类路径:

编码逻辑都很流畅,也没有报错,但是当把项目部署到tomcat服务器上时却在启动时报错如下

于是打开console页签查看输出:

除去其他的tomcat内部错误,只有这一条错误是有用的

 我以为可能是包的版本不对,于是去查看包下面的类的内容,确确实实有这个类啊:

回头 一想保存时都没报错肯定前期编译没错啊,这个类在当前类路径下应该是能找到的。所以上网百度了下"java.lang.NoClassDefFoundError: org/apache/commons/beanutils/Converter",说是要把包放在WEB-INF下的lib目录下,我试了以下,确实可行。

进一步深究就想起了tomcat类加载机制

======================================================================================

深入理解jvm这样讲到:

Tomcat5.x目录结构中有3组目录: “/ common/*”,“/server/*”,"/shared/*"可以存放Java类库,另外加上web应用程序自身的目录“WEB-INF/*”,一共四组。

Tomcat6.x版本,只有指定了tomcat/conf/catalina.proties配置文件的server.loader和share.loadr项后才会真正建立CatalinaClassloader和SharedClassLoader的实例,否则会用到这两个类加载器的地方都会用CommonClassLoader的实例代替,而且把 “/ common/*”,“/server/*”,"/shared/*"合并成了/lib目录

=======================================================================================

从上面的类加载模型图再基于双亲委派加载机制分析可知,要想应用程序能加载我们jar包中的类,必须把jar包放在WebApp类加载器通过双亲委派能到达的路径。也就是/common/*,/shared/*,和WEB-INF/*中,而/server/*对应的是Calalina类加载器下面的文件,所以访问不到。

我所遇到的类加载不到的问题也就是类库没有放在上述可用三个路径之一,在当前IDE的.classpath中的添加类库只能辅助生成.class文件,如果要在服务器中直接使用这些类库中的类的话,就会引发类加载不到错误,而最方便的方法当然就是把类库直接放到WEB-INF路径下咯,当然放在Tomcat的/lib目录下面也是可以的,但要注意,相互依赖的两个包必须放在同一目录下,比如commons-beanutils.jar依赖commons-logging.jar那么它们要么放在服务器的/lib目录下要么放在WEB-INF/lib目录下。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值