/*
* 一个WEB程序,发布到Tomcat里面运行。
* 首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器ClassLoader.getSystemClassLoader()。
* 而
* 我们后面的WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar、资源文件的时候,首先应该是使
* 用Thread.currentThread().getContextClassLoader()。如果你使用
* Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致(因为Java天生的多线程)。
* Test.class.getClassLoader()一般用在getResource,因为你想要获取某个资源文件的时候,这个资源文件的位置是相对固定的。
*
* 查看一下openfire或者tomcat内部的源码,对ClassLoader会有比较深的理解。
* 在openfire里面,openfire使用的类加载器,以及每个插件使用的类加载器都不一样。
*/
public static void main(String[] args) {
// 此时三个ClassLoader是同一个对象
System.out.println(Thread.currentThread().getContextClassLoader()); // 当前线程的类加载器
System.out.println(Test.class.getClassLoader()); // 当前类的类加载器
System.out.println(ClassLoader.getSystemClassLoader()); // 系统初始的类加载器
}
/* 请参考:http://stackoverflow.com/questions/676250/different-ways-of-loading-a-file-as-an-inputstream*/