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,处理方式有两种: 1、将但愿的jar包(本例是axiom-api-1.2.9.jar)拷贝到java/jre/lib/ext下,让JDK扩展先进行加载,但这样可能要将axiom的全部依赖包都要拷贝到ext下,可能数量会不少,并且会对整个websphere下的应用都有影响,若是须要拷贝的jar包数量少值得采用,若是太多则不建议。 2、将类加载顺序改为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,也就选择了自已负责一切,之前本地类所能依赖的容器类不能再依赖了,当前的解决办法只能是将须要的容器类拷贝到本地,使其成为本地类。 不知这样理解是否全面?但愿描述的现象能给遇到问题的朋友一些帮助了。