-★出爺;3 发表于 2017-1-24 08:30:55

tomcat源码阅读 二--------隐藏的ClassLoader

  在看tomcat源码是发现了一个比较有趣的配置文件-------catalina.properties
  这个配置文件分为四部分
  第一部分:安全设置
  第二部分:类加载设置
  common.loader
通常情况下,common.loader是已经设置好的,不需要修改。
common.loader包括以下路径:


[*]unpacked classes and resources in  $CATALINA_BASE/lib
[*]JAR files in  $CATALINA_BASE/lib
[*]unpacked classes and resources in  $CATALINA_HOME/lib
[*]JAR files in  $CATALINA_HOME/lib

和默认的一些jar包:

[*]
annotations-api.jar  — JavaEE annotations classes.
[*]
catalina.jar  — Implementation of the Catalina servlet container portion of Tomcat.
[*]
catalina-ant.jar  — Tomcat Catalina Ant tasks.
[*]
catalina-ha.jar  — High availability package.
[*]
catalina-tribes.jar  — Group communication package.
[*]
ecj-*.jar  — Eclipse JDT Java compiler.
[*]
el-api.jar  — EL 2.2 API.
[*]
jasper.jar  — Tomcat Jasper JSP Compiler and Runtime.
[*]
jasper-el.jar  — Tomcat Jasper EL implementation.
[*]
jsp-api.jar  — JSP 2.2 API.
[*]
servlet-api.jar  — Servlet 3.0 API.
[*]
tomcat-api.jar  — Several interfaces defined by Tomcat.
[*]
tomcat-coyote.jar  — Tomcat connectors and utility classes.
[*]
tomcat-dbcp.jar  — Database connection pool implementation based on package-renamed copy of Apache Commons Pool and Apache Commons DBCP.
[*]
tomcat-i18n-**.jar  — Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.
[*]
tomcat-jdbc.jar  — An alternative database connection pool implementation, known as Tomcat JDBC pool. See  documentation  for more details.
[*]
tomcat-util.jar  — Common classes used by various components of Apache Tomcat.
  这些都是系统和工具类,比如数据库的驱动类库、log 类库可以放到此处,web应用的jar 不要放到common.loader 中。
  server.loader 和 shared.loader 
在common.loader 加载完后,tomcat启动程序会检查 catalina.properties文件中配置的server.loader和shared.loader是否设置
如果设置,读取 tomcat下对应的server和shared这两个目录的类库。
server和shared是对应tomcat目录下的两个目录,默认的Tomcat7 下这两个目录是没有的。
设置方法:
server.loader=${catalina.base}/server/classes,${catalina.base}/server/lib/*.jar
shared.loader=${catalina.base}/server/classes,${catalina.base}/server/lib/*.jar
同时需要在tomcat目录下创建 server和shared目录结构并将公用的、应用类放到里面。
Bootstrap--->System--->/WEB-INF/classes---> /WEB-INF/lib/*.jar---> Common --->Server --->Shared

catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
------------------------------------------------------------------------------------
public void init() throws Exception {
initClassLoaders();
Thread.currentThread().setContextClassLoader(catalinaLoader);
SecurityClassLoad.securityClassLoad(catalinaLoader);
// Load our startup class and call its process() method
if (log.isDebugEnabled())
log.debug("Loading startup class");
Class<?> startupClass =
catalinaLoader.loadClass
("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.newInstance();
// Set the shared extensions class loader
if (log.isDebugEnabled())
log.debug("Setting startup class properties");
String methodName = "setParentClassLoader";
Class<?> paramTypes[] = new Class;
paramTypes = Class.forName("java.lang.ClassLoader");
Object paramValues[] = new Object;
paramValues = sharedLoader;
Method method =
startupInstance.getClass().getMethod(methodName, paramTypes);
method.invoke(startupInstance, paramValues);
//初始化tomcat的守护进程
catalinaDaemon = startupInstance;
}


  源码在tomcat启动时基本是采用catalinaLoader来加载tomcat自身相关的jar,但catalinaLoader的父Loader就是commonLoader,而且org.apache.catalina.startup.Catalina这个类其实就在common文件夹下面,而在catalina.properties文件中serverLoader配置默认为空,所以我基本任务这里的catalinaLoader就是commonLoader
  第三部分:不需要扫描的类设置
  第四部分:字符缓存设置
页: [1]
查看完整版本: tomcat源码阅读 二--------隐藏的ClassLoader