WebSphere类加载顺序的困扰

我们知道WebSphere有两种类加载的顺序:父类优先(parent first),本地类优先(parent last),下面是在WebSphere7上的截图:
[img]http://dl.iteye.com/upload/attachment/439455/59c3e246-043d-3d89-83f4-d94e92d1676e.png[/img]
图1-父类优先-类装入器查看器截图

[img]http://dl.iteye.com/upload/attachment/439459/b8b72e38-84a3-3f67-a0e3-3aebb2ba858b.png[/img]
图2-本地类优先-类装入器查看器截图

困扰在于,WebSphere的类加载器多达7个(按照类型来分,也有Java Class loaders、WebSphere Extensions class loader、Application class loader、WAR class loader等4类),但是加载顺序只提供了两种,能否像在本地Eclipse使用tomcat时随意设置类加载的顺序呢?能否先Java Class loaders->Application class loader ->WebSphere Extenstions class loader ->WAR class loader呢?
WebSphere is strict。好像不提供这种灵活性。


近日,遇到一个问题,默认的加载顺序是parent first,在Websphere6上面应用可以正常部署运行。当升级到WebSphere7后出现了类冲突,通过类装入器查看器搜索发现,本地应用的axiom-api-1.2.9.jar与plugins/org.apache.axis2.jar中存在某个类冲突。
显然org.apache.axis2.jar属于WebSphere Extensions class loader,处理方式有两种:
一、将希望的jar包(本例是axiom-api-1.2.9.jar)拷贝到java/jre/lib/ext下,让JDK扩展先进行加载,但这样可能要将axiom的所有依赖包都要拷贝到ext下,可能数量会很多,而且会对整个websphere下的应用都有影响,如果需要拷贝的jar包数量少值得采用,如果太多则不建议。
二、将类加载顺序改成parent last,让其先加载本地应用的axiom-api-1.2.9.jar,但是原本本地应用可以依赖的父类一下子都class not found了,必须将其找到,拷贝到本地应用目录下。
特别的,遇到java.Lang.VerifyError的错误,阻碍许久。经过……摸索,发现在类装入器中存在如下情况

[img]http://dl.iteye.com/upload/attachment/439476/ad87b98e-6757-37f8-bf9d-bf8af898dd0c.png[/img]
图3-无法获取文件名-类装入查看器

是否能这么理解,某些类WebSphere识别出了,但又不能正确加载,导致不报ClassNotFound的异常,而报VerifyError的异常了。最后在jre/lib下找到相应jar包,拷贝到本地,问题解决。


理解:但选择了本地类优先parent last,也就选择了自已负责一切,以前本地类所能依赖的容器类不能再依赖了,当前的解决办法只能是将需要的容器类拷贝到本地,使其成为本地类。
不知这样理解是否全面?希望描述的现象能给遇到问题的朋友一些帮助了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值