ClassLoader的使用 Tomcat对不同的模块可能使用不同的ClassLoader加载。这也就是为什么很多类不在启动的classpath中,却可以被它调用的原因。 下面是Bootstrap初始化ClassLoader的方法: private void initClassLoaders() { try { ClassLoaderFactory.setDebug(debug); commonLoader = createClassLoader("common", null); catalinaLoader = createClassLoader("server", commonLoader); sharedLoader = createClassLoader("shared", commonLoader); } catch (Throwable t) { log("Class loader creation threw exception", t); System.exit(1); } }
下图是Tomcat用户手册上看到的。 Bootstrap | System | Common / \ Catalina Shared (server) / \ Webapp1 Webapp2 ... Bootstrap是JVM提供的 System是在classpath中提供的 Common包含配置文件/org/apache/catalina/startup/catalina.properties中指定的类库支持 Catalina和Shared都从Common中继承,包含的类库也在上面配置文件中指定。 WebappX在部署单个Tomcat5实例时指定。一个webapp下面的类库对另外一个是不可见的 Tomcat加载类的顺序和普通的不太一样,如下: Bootstrap classes of your JVM System class loader classses (described above) /WEB-INF/classes of your web application /WEB-INF/lib/*.jar of your web application $CATALINA_HOME/common/classes $CATALINA_HOME/common/endorsed/*.jar $CATALINA_HOME/common/lib/*.jar $CATALINA_BASE/shared/classes $CATALINA_BASE/shared/lib/*.jar 注意,如果希望不使用JVM本身提供的类。这时可以使用jdk的endorsed 特性。 |
|