存档

2009年6月15日 的存档

再谈WebSphere的类加载和故障排查

2009年6月15日 hashei 2 条评论

引言

上次在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]
...

阅读全文…

分类: Websphere系列, 排错 标签: ,