昨天,我看到了build Standalone的databrusher的脚本,Java类好像不在classpath中,好像可以一直运行。 抱着疑问,询问了对应的开发者,自己仔细看了那个代码,知道了原理。 命令位于$ Java _ home/xqdxlz/Java $ Java _ opts com.Alibaba.standalone.appstartorcom.Alibaba.intl.standalone 运行名为com.Alibaba.standalone.appstart or的class。 启动classloader并加载com.Alibaba.intl.standalone.datab rusher.start or。 积极的山被指定为WORLDS-INF目录的加载类。 然后,com.Alibaba.intl.standalone.datab rusher.start or将启动相应的“$main_class”. 然后,我仔细看了Java的classloader,了解了它的原理。 以下也简单总结一下吧。 java虚拟机由名为sun.misc.Launcher或java (或java.exe )的程序初始化。 虚拟机按以下顺序搜索和加载所有必需的类:1,引导类:是配置基本java平台类(如rt.jar和i18n.jar )的扩展类:使用java扩展机制的类在lib/ext的. jar包. 3中,没有使用用户类3360的开发者定义的类或Java扩展机制的第三方产品。 必须在命令行中使用-classpath选项或-classpath选项的Java类加载器概述如下图所示。 http://ren yongjie 668.blog.163.com/prevphdownload.do? host=ren yongjie 668 albumid=197449439 photoid=6568564371 bootstrap class loader
---扩展类加载器---系统类加载器虚拟机启动时,将首先执行初始化操作。 初始化动作完成后
生成第一个类加载器,即所谓的Bootstrap Loader。 Bootstrap Loader由c编写,该Bootstrap由
在Loader进行的初始作业中,除了基本的初始化动作外,加载定义为sun.misc也是最重要的
命名空间下的Launcher.java中的ext class loader (因为是inner class
所以编译后会变成Launcher$ExtClassLoader.class ),并设置其Parent
null表示父加载程序是引导加载程序。 然后,Bootstrap Loader请求在sun.misc中定义的加载
命名空间下的Launcher.java中的app class loader (因为是inner
因为是class,所以编译后会变成Launcher$AppClassLoader.class ),并设置其Parent
以前生成的ExtClassLoader实例。 a. Bootstrap ClassLoader/启动类加载器主要负责处理由java_home/jre/lib目录中的核心api或-Xbootclasspath选项指定的jar包装程序. b. Extension ClassLoader/扩展类加载器主要用于ext目录下的jar包或-Djava.ext.dirs指定目录下的jar包,用于c.system class loader 如果负责-DJAva.class.path或$CLASSPATH的$CLASSPATH为空,则缺省情况下,jdk将使用正在运行的Java类的当前路径作为缺省$CLASSPATH。 但是,如果设置$CLASSPATH变量,则会转至与$CLASSPATH对应的路径以查找对应的类,如果找不到,则会报告错误。 这个结论,我经过测试,看到了下一个类加载器的源代码。 (d. User Custom ClassLoader/用户定义的类加载器) java.lang.ClassLoader的子类)在程序运行时将java.lang.ClassLoader的子类添加到体现了java动态实时类读取特性。 为了获得更多的理解,编写了一个简单的java程序,测试了前面三种classloader可以加载类的路径及其parent类。 代码如下所示。 import java.net.URL;
import java.net.URLClassLoader;
//*
*
@className: IClassLoader* @description: 测试三种classloader加载类的路径,及其parent
* @author: 笑遍世界
* @createTime: 2010-11-17 下午07:33:40
*/
public class IClassLoader {
public static void main(String[] args) {
// 测试bootstrap classloader 的类加载路径
URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i].toExternalForm());
}
// 测试extension classloader 的类加载路径,先打印一个路径,再打印出其parent,然后再打印出类加载路径中的所有jar包
System.out.println("-------------------------------------");
System.out.println(System.getProperty("java.ext.dirs"));
ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();
System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());
System.out.println("extension classloader can use thess jars:");
URL[] extURLs = ((URLClassLoader)ClassLoader.getSystemClassLoader().getParent()).getURLs();
for (int i = 0; i < extURLs.length; i++) {
System.out.println(extURLs[i]);
}
// 测试system classloader 的类加载路径,其实也就时classpath的路径,并打印出它的parent
System.out.println("-------------------------------------");
System.out.println(System.getProperty("java.class.path"));
System.out.println(ClassLoader.getSystemResource(""));
ClassLoader systemClassloader=ClassLoader.getSystemClassLoader();
System.out.println("the parent of system classloader : "+systemClassloader.getParent());
}
}本机(linux+jdk1.5)运行结果如下:file:/usr/ali/java/jre/lib/rt.jar
file:/usr/ali/java/jre/lib/i18n.jar
file:/usr/ali/java/jre/lib/sunrsasign.jar
file:/usr/ali/java/jre/lib/jsse.jar
file:/usr/ali/java/jre/lib/jce.jar
file:/usr/ali/java/jre/lib/charsets.jar
file:/usr/ali/java/jre/classes
-------------------------------------
/usr/ali/java/jre/lib/ext
the parent of extension classloader : null
extension classloader can use thess jars:
file:/usr/ali/java/jre/lib/ext/djm.jar
file:/usr/ali/java/jre/lib/ext/localedata.jar
file:/usr/ali/java/jre/lib/ext/dnsns.jar
file:/usr/ali/java/jre/lib/ext/sunpkcs11.jar
file:/usr/ali/java/jre/lib/ext/sunjce_provider.jar
-------------------------------------
.:/usr/ali/java/lib/dt.jar:/usr/ali/java/lib/tools.jar
file:/home/master/workspace/2010_11/xqdxlz/
the parent of system classloader : sun.misc.Launcher$ExtClassLoader@1a5ab41
//ps:当前路径.即是/home/master/workspace/2010_11/xqdxlz/关于Java的classloader其原理还是需要好好理解才能清楚的,仅通过一天的了解,记录为上面那么多吧。更多详细信息,可以参考如下资料:http://snandy.javaeye.com/blog/307083http://haofenglemon.javaeye.com/blog/426382http://blog.csdn.net/zdwzzu2006/archive/2008/04/05/2253982.aspxhttp://wuquanyin1011.javaeye.com/blog/703842http://hi.baidu.com/yangzhixqdxlz_bai/blog/item/78846cce1cb86b0992457ead.htmlhttp://www.blogjava.net/clraychen/archive/2008/02/20/180868.html