概述
我们知道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,也就选择了自已负责一切,以前本地类所能依赖的容器类不能再依赖了,当前的解决办法只能是将需要的容器类拷贝到本地,使其成为本地类。
不知这样理解是否全面?希望描述的现象能给遇到问题的朋友一些帮助了。
最后
以上就是要减肥樱桃为你收集整理的WebSphere类加载顺序的困扰的全部内容,希望文章能够帮你解决WebSphere类加载顺序的困扰所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复