类加载问题

最近发现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.youkuaiyun.com/xrt95050/article/details/4413998

https://blog.youkuaiyun.com/hnzmdpan/article/details/78637635

https://blog.youkuaiyun.com/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. 对类的静态变量,静态代码块进行初始化

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值