tomcat7类加载器的分析
在Bootstrap类中,进行完路径设置后
initClassLoaders();
开始初始化类载加器
我们可以看到在tomcat的启动脚本中
"java"
-Djava.util.logging.config.file="D:\apache-tomcat-7.0.0\conf\logging.properties"
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.endorsed.dirs="D:\apache-tomcat-7.0.0\endorsed"
-classpath "D:\apache-tomcat-7.0.0\bin\bootstrap.jar;D:\apache-tomcat-7.0.0\bin\tomcat-juli.jar"
-Dcatalina.base="D:\apache-tomcat-7.0.0"
-Dcatalina.home="D:\apache-tomcat-7.0.0"
-Djava.io.tmpdir="D:\apache-tomcat-7.0.0\temp"
org.apache.catalina.startup.Bootstrap start
有关classpath的设置,只有两个jar文件,那么,在lib中的jar又是如何被加载入tomcat中的呢?
首先这两个jar文件的类加载器是appclassloader.这点可以确定
在分析之前需要了解tomcat的一个重要的配置文件apache-tomcat-7.0.0\conf\catalina.properties
initClassLoaders()首先从这个配置文件中找common.loader为key的值
${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
首先处理掉其中的引用部分,对逗号分割的每一个值进行处理,这里只有第一个被认识正确的值才是有用的
之后,使用这个路径,通过类加载器工厂产生一个类加载器
ClassLoader classLoader = ClassLoaderFactory.createClassLoader(locations, types, parent);
这里自定义的类加载器是以URLClassLoader为父类的
第一个commonclassloader就已经建立成功了,由于 没有设置父类加载器,则commonclassloader的父类加载器是appclassloader
插一句,这里的自定义类加载器也被注册到MBeanServer中
之后,tomcat对server,shared目录建立了自己的classloader,他们的父类加载器就是commonclassloader
在tomcat7中也许你看不到server,shared目录了,但在早期的版本中还是会有这样的目录 存在
以上纯属个人分析的结果,如果有错误,欢迎指证.大家一起进步
在Bootstrap类中,进行完路径设置后
initClassLoaders();
开始初始化类载加器
我们可以看到在tomcat的启动脚本中
"java"
-Djava.util.logging.config.file="D:\apache-tomcat-7.0.0\conf\logging.properties"
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.endorsed.dirs="D:\apache-tomcat-7.0.0\endorsed"
-classpath "D:\apache-tomcat-7.0.0\bin\bootstrap.jar;D:\apache-tomcat-7.0.0\bin\tomcat-juli.jar"
-Dcatalina.base="D:\apache-tomcat-7.0.0"
-Dcatalina.home="D:\apache-tomcat-7.0.0"
-Djava.io.tmpdir="D:\apache-tomcat-7.0.0\temp"
org.apache.catalina.startup.Bootstrap start
有关classpath的设置,只有两个jar文件,那么,在lib中的jar又是如何被加载入tomcat中的呢?
首先这两个jar文件的类加载器是appclassloader.这点可以确定
在分析之前需要了解tomcat的一个重要的配置文件apache-tomcat-7.0.0\conf\catalina.properties
initClassLoaders()首先从这个配置文件中找common.loader为key的值
${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
首先处理掉其中的引用部分,对逗号分割的每一个值进行处理,这里只有第一个被认识正确的值才是有用的
之后,使用这个路径,通过类加载器工厂产生一个类加载器
ClassLoader classLoader = ClassLoaderFactory.createClassLoader(locations, types, parent);
这里自定义的类加载器是以URLClassLoader为父类的
第一个commonclassloader就已经建立成功了,由于 没有设置父类加载器,则commonclassloader的父类加载器是appclassloader
插一句,这里的自定义类加载器也被注册到MBeanServer中
之后,tomcat对server,shared目录建立了自己的classloader,他们的父类加载器就是commonclassloader
在tomcat7中也许你看不到server,shared目录了,但在早期的版本中还是会有这样的目录 存在
以上纯属个人分析的结果,如果有错误,欢迎指证.大家一起进步