存档

文章标签 ‘类加载’

Java 类加载器的又一篇文章

2010年3月3日 hashei 2 条评论

之前写过两篇关于java类加载的文章,分别是:《WebSphere的类加载机制和故障排查》,《再谈WebSphere的类加载和故障排查》。今天在IBM网站上看到一篇《深入探讨 Java 类加载器》,分享出来炒炒冷饭。以后遇到问题的时候也能有点方向。

Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行交互的情况,而对类加载器的机制又不是很了解的话,就很容易花大量的时间去调试 ClassNotFoundExceptionNoClassDefFoundError 等异常。本文将详细介绍 Java 的类加载器,帮助读者深刻理解 Java 语言中的这个重要概念。

启用安全性后无法停止WAS的解决方法

2009年6月20日 hashei 没有评论

按照前一篇启用WebSphere管理安全性,你也许已经为WAS添加了密码来防止未授权的访问。但是当你想在Windows服务中重启、停止websphere时,你会发现无法停止,提示你“发生内部错误”。而在Systemout.log中,则有:

00000056 RoleBasedAuth A SECJ0305I: 对于 admin-authz 操作 Server,基于角色的授权检查失败:stop:java.lang.Boolean:java.lang.Integer。用户 UNAUTHENTICATED(唯一标识:unauthenticated)未被授予下列任何必需角色:administrator, operator。

这是由于was服务启动用户一般是“本地系统”或者“Administraotr”,而这两个用户都是非认证(unauthenticated)的。如果没有被添加为服务,或者在Unix/Linux环境下,停止服务器时就会提示你输入用户名和密码,或者运行命令时添加“-username 用户名 -password 密码”参数。

所以解决的方法很简单,只要更新一下WAS服务属性即可。在wasHome下的bin目录中,运行

wasservice -add 服务名(跟在IBMWAS61Service – 后的那部分)-serverName server1 -profilePath E:\IBM\WebSphere\AppServer\profiles\AppSrv02 -stopArgs “-username 用户名 -password 密码”

启动服务时不需要用户名密码,所以不需要添加-startArgs参数。得到提示:

Service already exists, updating parameters…

阅读全文…

再谈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系列, 排错 标签: ,

WebSphere的类加载机制和故障排查

2009年5月27日 hashei 没有评论

在部署WebSphere应用的过程中,经常会发生诸如:ClassCastException、ClassNotFoundException、NoClassDefFoundException、UnsatisfiedLinkError的错误。这种有关“类”(Class)的错误,往往来无影——开发环境好的,怎么在生产环境就有问题;而且去无踪——单独建立一个Profile部署一下就没问题了,把Jar包换个目录就OK了。其实要解决这些怪异的问题,首先要了解WebSphere的类加载(Class loader)机制。

下文主要内容来自http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/welcome_nd.html 和IBM developworks中的《如何在WebSphere中解决jar包冲突》一文,我把个人觉得最容易理解的部分总结在一起,方便学习和快速的解决问题。

使用的类装入器以及使用顺序

WebSphere Application Server 的运行时环境按以下顺序使用下列类装入器来查找和装入应用程序的新类:

  1. Java 虚拟机创建的引导程序、扩展和 CLASSPATH 类装入器引导程序类装入器使用引导类路径(通常是 jre/lib 中的类)找到并装入类。扩展类装入器使用系统属性 java.ext.dirs(通常是 jre/lib/ext)找到并装入类。CLASSPATH 类装入器使用 CLASSPATH 环境变量查找和装入类。CLASSPATH 类装入器装入 WebSphere Application Server 产品在 j2ee.jar 文件中提供的 Java 2 Platform, Enterprise Edition(J2EE)应用程序编程接口(API)。由于这个类装入器装入 J2EE API,所以,可以将依赖于 J2EE API 的库添加到类路径系统属性中以扩展服务器类路径。但是,扩展服务器的类路径的首选方法是添加共享库
  2. WebSphere 扩展类装入器WebSphere 扩展类装入器装入在运行时需要的 WebSphere Application Server 类。扩展类装入器使用 ws.ext.dirs 系统属性来确定装入类时所使用的路径。ws.ext.dirs 类路径中的每个目录和这些目录中的每个 Java 归档(JAR)文件或 ZIP 文件都添加到此类装入器使用的类路径中。如果安装在服务器上的应用程序模块引用了与资源提供程序相关联的资源,并且该提供程序指定了资源驱动程序的目录名称,那么 WebSphere 扩展类装入器还将资源提供程序类装入到服务器中。
  3. 一个或多个应用程序模块类装入器,它们负责装入在服务器中运行的企业应用程序的元素应用程序元素可以是 Web 模块、企业 bean(EJB)模块、资源适配器归档(RAR 文件)和依赖项 JAR 文件。应用程序类装入器按照 J2EE 类装入规则从企业应用程序装入类和 JAR 文件。WebSphere Application Server 允许使共享库与应用程序相关联。
  4. 零个或多个 Web 模块类装入器缺省情况下,Web 模块类装入器装入 WEB-INF/classes 和 WEB-INF/lib 目录的内容。Web 模块类装入器是应用程序类装入器的子代。可以指定使用应用程序类装入器来装入 Web 模块的内容,而不是使用 Web 模块类装入器来装入这些内容。

阅读全文…