类加载问题

最近发现Jenkins上跑的一个案例报如下错误

定位日志发现是调用jar里的一个类,而这个类加载的XXX.context.xml配置文件中配置的是连接别的系统的JNDI URL和端口地址,由于junit测试是相对独立的,所以当SRC下面的类引用到这个时,边报异常了,

 

后来通过修改本地 build-junit.xml中的,增加了一个jarjar里面的class文件是重写报错的jar里面的类的。

<classpathrefid="master-classpath"/>

<path id="master-classpath">

       <filesetfile="${build.ext.dir}/Areplace.jar"/>

        <filesetdir="${build.lib.dir}"/>

        <filesetfile="${lib.weblogic.jar}"/>

           <filesetfile="${weblogic.server.lib}/ojdbc6.jar"/>           

</path>    

  1. 那为什么一开始Eclispe里面Junit是可以执行成功的呢?原因是因为所引用的那个错误的jar位于所测试的类的后面,后来我把用jar调到最上面位置,发现确实是这个原因

 

 

见博客https://blog.csdn.net/xrt95050/article/details/4413998

https://blog.csdn.net/hnzmdpan/article/details/78637635

https://blog.csdn.net/lipei1220/article/details/53924799

 

简单总结下:

Bootstrap classloader---引导类加载器,负责加载Java的核心类,sun.boot.class.path统属性下的类

本地测试结果:

 

C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\lib\resources.jar;C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\lib\rt.jar;C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\lib\sunrsasign.jar;C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\lib\jsse.jar;C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\lib\jce.jar;C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\lib\charsets.jar;C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\classes

 

extension classloader---扩展类加载器,负责加载jre的扩展目录中jar的类包,这为引入除Java核心类以外的新功能提供了一个标准机制

 

本地测试结果:

C:\Oracle\Middleware\jdk160_14_R27.6.5-32\jre\lib\ext;C:\windows\Sun\Java\lib\ext

 

System classLoader –系统类加载器,它负责在JVM启动时,加载来自java工程中指定的CLASSPATH

本地测试结果:

XXworkplace\cfs\lib\ant.jar; XXworkplace\cfs\lib\aop_log.jar;

 

Extension classloader systemclassloader parent,而bootstrap classloader extension classloaderparent,但它不是一个实际的classloader,

 

每个classLoader加载Class的过程:

1.检测此CLass是否载入过(即在cache中是否有此Class),如果有的话,则到8

2.如果parent classloader不存在(没有parent,那parent一定是bootstrap),到4

3.请求parent classloader载入,如果成功到8,不成功到5

4.请求Jvmbootstrap载入,如果成功到8

5.寻找CLass文件(从与此classloader相关的类路径中寻找),如果找不到则到7

6.从文件中载入class,到8

7.抛出ClassNotFoundException

8.返回class

 

类的工作机制

  1. 查找和导入Class文件

  2. 把类的二进制数据合并到JRE

  3. 检查载入Class文件的正确性

  4. 给类的静态变量分配存储空间

  5. 将符号引用转成直接引用

  6. 对类的静态变量,静态代码块进行初始化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值