老鸟谈J2EE中怎么解决jar包冲突问题

小微 科技老鸟谈J2EE中怎么解决jar包冲突问题已关闭评论160字数 1944阅读模式
摘要前言我们都知道,J2EE应用程序一般由jar包、class文件和配置文件构成,J2EE应用程序开发完成后,一般打包放到tomcat容器中运行。项目运行过程中,往往会出现某个类找不到...

咱们都知道,J2EE利用程序一般由jar包、class文件以及配置文件形成,J2EE利用程序开发完成后,一般打包放到tomcat容器中运行。项目运行进程中,常常会呈现某个类找不到(java.lang.ClassNotFoundException),或者或呈现类中的某个办法不决义(java.lang.NoSuchMethodException),那么针对这种问题,咱们该怎么排查呢?要弄清这种问题,咱们必需得知道java class的加载机制及原理,特别是jar包及class的加载顺序。

J2EE利用程序运行时所依赖的jar包以及class文件有哪些?文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

  1. $java_home/lib 目录下的java核心api,这些类一般为由BootstrapClassLoader加载的。
  2. $java_home/lib/ext 目录下的java扩大jar包,这些类一般为由ExtensionClassLoader加载的。
  3. jvm命令java运行参数中指定的 -classpath 或 -Djava.library.path所指的目录下的类与jar包。
  4. 项目路径/WEB-INF/lib下的jar文件,这些类一般为由利用程序ClassLoader加载的。
  5. 项目路径/WEB-INF/classes下的class文件,这些类一般为由利用程序ClassLoader加载的。
  6. $CATALINA_HOME/co妹妹on下的jar包,这些类是由tomcat本身类加载器加载完成的,tomcat打破了双亲委派类加载机制,自定义了一些类加载器,感兴致的朋友可以深刻学习tomcat原理。
  7. $CATALINA_HOME/server目录下的jar包,加载的进程同上。
  8. $CATALINA_BASE/shared目录下的jar包,加载的进程同上。

jar包以及class文件加载的顺序是啥样的?文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

依照上面编号进行排序的结果为(加载顺序由早到晚):1->2->3->6->7->8->5->4,从排序结果可知,java环境变量下的jar包或类优先加载,其次为tomcat目录下的,最后为项目路径下的,这里要说明的是,假如项目路径WEB-INF/class下如果有一个class文件与项目WEB-INF/lib 某一个jar包中的class文件包名类名都相同时,那么优先加载WEB-INF/class下的那个。文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

jar包冲突问题排查(细心看,很重要哦!) 文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

​​​​​​​​​​​​​ 咱们在做J2EE利用程序开发时,时常会遇见找不到某个类或办法的问题,这些问题的本源还是在于利用程序运行时,依赖的jar包不存在或jar包中的类有冲突。现在java利用程序开发时,一般都基于 maven管理依赖的jar包,能很好的解决上面说的问题,然而,对于一些暗藏问题,maven是很难发现的。举个例子,项目路径/WEB-INF/lib目录下有个b.jar,b.jar中有一个com.demo.A类,A类中有m1,m2,m3三个办法。项目开发完成后提交给测试进行验证,发现异样信息,过错日志提醒找不到A类中的m3办法,这个时候是否堕入了恐慌的状况?明明是有m3办法的呀,为什么找不到,愁闷...,对于这类问题,如果是一个新手或者经验不足的老鸟,估量要耗损大量的时间来排查,并且结果会不尽人意。那么,该如何去解决?文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

首先还是要了解jar及class文件的加载原理,为什么会呈现上面的现象,缘由就在于jvm当前加载的那个A类不是你b.jar包中的那个A类,那么你的疑难来了,我项目中的那个指望的A类为什么没被加载?谜底就是你指望的那个A类被顶替了。文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

其次,咱们知道问题的缘由了,A类为什么被顶替?缘由在于jvm在加载项目中的A类前,已经加载了WEB-INF/lib 下此外一个a.jar包中一样包名下的A类,但是这个A类中只有m1,m2两个办法,所以项目运行时就找不到m3办法了。需要说明的是,a.jar以及b.jar都属于同一个ClassLoader加载的,所以先加载的a.jar中的A类,b.jar中的A类就不加载了,如果a.jar以及b.jar用不同的ClassLoader进行加载,那么就不会呈现这类现象,会存在两个一样包名下名字相同的A类,但这两个A类是互相隔离的。关于ClassLoader的工作原理及隔离机制,大家可以看下《深刻理解java虚拟机》这本书。文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

总结文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

总之,jar包冲突的问题怎么解决,还是得深刻了解jvm类加载原理。此外在java的学习进程中,不能忽视了jvm原理的学习,熟练掌握jvm原理对程序的性能优化有很大的帮助,同时处理一些疑问问题也轻而易举。文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

以上就是微观生活(93wg.com)关于“老鸟谈J2EE中怎么解决jar包冲突问题”的详细内容,希望对大家有所帮助!文章源自微观生活(93wg.com)微观生活-https://93wg.com/11527.html

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/11527.html