再谈WebSphere的类加载和故障排查
引言
上次在WebSphere的类加载机制和故障排查一文中整理了一下Classloader的一些概念和加载原理,但是概念的应用不是很明确,故障排查也没有具体的方法。所以今天再次整理了IBM developerworks里有参考价值的文章,希望在遇到ClassCastException、ClassNotFoundException、NoClassDefFoundException、UnsatisfiedLinkError的错误时提供解决思路。
《IBM WebSphere 开发者技术期刊: 类路径冲突的鉴别》一文描述了应用迁移过程中所发生的“故障”,打引号那是因为WAS并没有发出ClassNotFoundException、NoClassDefFoundException等的错误信息,而是“并非预期中的表现”。最终排查的结果是:
其结果是
C:/Program Files/IBM/WebSphere Studio/Application Developer/v5.1.1/runtimes/base_v51/lib/jython.jar,而不是我们期望的WEB-INF/lib/jakarta-oro-2.0.7.jar。
这是一个很典型的类加载错误例子,默认的PARENT_FIRST加载模式让类加载器从应用程序 类装入器中先加载了jython.jar(正好有需要的同名类),而不是Web 模块类装入器里正确的jakarta-oro-2.0.7.jar。解决的方法可以启用PARENT_LAST 加载模式即可。文章中检测类加载路径的Servelet可以作为参考,不过我觉得一般会用-verbose 命令行选项打开 IBM JVM 的详细输出、trace某个确定类的情况或者dump的方法找到类加载路径。
调试方法
《类装入问题解密,第 1 部分: 类装入和调试工具介绍》 介绍了这三种方法
可以用
-verbose命令行选项打开 IBM JVM 的详细输出。当某些事件发生的时候(例如,类装入时),详细输出会在控制台上显示信息。要想得到额外的类装入信息,可以用详细类输出。可以用-verbose:class选项启动这个模式。解释详细输出
详细输出列出已经打开的所有 JAR 文件,包括到这些 JAR 的完整路径。下面是一个示例:... [Opened D:\jre\lib\core.jar in 10 ms] [Opened D:\jre\lib\graphics.jar in 10 ms] ...所有装入的类都已经列出,同时还指出它们是从哪个 JAR 文件或目录装入的。例如:
... [Loaded java.lang.NoClassDefFoundError from D:\jre\lib\core.jar] [Loaded java.lang.Class from D:\jre\lib\core.jar] [Loaded java.lang.Object from D:\jre\lib\core.jar] ...


最及时的声音