我们在代码中为了获取某个配置文件路径下的文件经常会这么写

  1. String tomcatPath = System.getProperty("catalina.home") + "/webapps/axis2/WEB-INF/conf/";
  2. tomcatPath = tomcatPath.replace("/", File.separator); //使用此方法是为了区分unix系统与windows,
  3. //File.separator UNIX中为/,而WINDOWS下为\

而在检查环境变量的时候可能会发现,系统中并不存在catalina.home或者说并不存在CATALINA_HOME环境变量,那么我们在运行时成功的得到了CATALINA_HOME路径,

并且如果多个tomcat实例存在,那么可以得到各自tomcat实例下安装路径对应的路径。

这是因为System.getProperty严格意义上来讲指AppClassLoader得到的property,即程序运行时的环境变量。

例如在TOMCAT运行时中,TOMCAT启动之初便会设置环境变量catalina.home。

所以可以得到tomcat实例下对应的路径。

参考:

[tomcat7源码学习]初始化之catalina.home和catalina.base

初始化之catalina.home和catalina.base

首先先看一下这两个参数在tomcat源码中的注释(参考类Globals):

  1. /**
  2. * Name of the system property containing
  3. * the tomcat product installation path
  4. */
  5. public static final String CATALINA_HOME_PROP = "catalina.home";
  6.  
  7. /**
  8. * Name of the system property containing
  9. * the tomcat instance installation path
  10. */
  11. public static final String CATALINA_BASE_PROP = "catalina.base";

就两个差异,一个是product,一个是instance。

再看一下RUNNING.txt中的说明

  1. ==================================================
  2. Advanced Configuration - Multiple Tomcat Instances
  3. ==================================================
  4.  
  5. In many circumstances, it is desirable to have a single copy of a Tomcat
  6. binary distribution shared among multiple users on the same server. To make
  7. this possible, you can set the CATALINA_BASE environment variable to the
  8. directory that contains the files for your 'personal' Tomcat instance.
  9.  
  10. When running with a separate CATALINA_HOME and CATALINA_BASE, the files
  11. and directories are split as following:
  12.  
  13. In CATALINA_BASE:
  14.  
  15. * bin - Only the following files:
  16.  
  17. * setenv.sh (*nix) or setenv.bat (Windows),
  18. * tomcat-juli.jar
  19.  
  20. The setenv scripts were described above. The tomcat-juli library
  21. is documented in the Logging chapter in the User Guide.
  22.  
  23. * conf - Server configuration files (including server.xml)
  24.  
  25. * lib - Libraries and classes, as explained below
  26.  
  27. * logs - Log and output files
  28.  
  29. * webapps - Automatically loaded web applications
  30.  
  31. * work - Temporary working directories for web applications
  32.  
  33. * temp - Directory used by the JVM for temporary files (java.io.tmpdir)
  34.  
  35. In CATALINA_HOME:
  36.  
  37. * bin - Startup and shutdown scripts
  38.  
  39. The following files will be used only if they are absent in
  40. CATALINA_BASE/bin:
  41.  
  42. setenv.sh (*nix), setenv.bat (Windows), tomcat-juli.jar
  43.  
  44. * lib - Libraries and classes, as explained below
  45.  
  46. * endorsed - Libraries that override standard "Endorsed Standards"
  47. libraries provided by JRE. See Classloading documentation
  48. in the User Guide for details.
  49.  
  50. By default this "endorsed" directory is absent.

大概意思就是

  • CATALINA_BASE:是实例配置位置,也就是一个tomcat可以配置多个实例,实例里面有自己的配置
  • CATALINA_HOME:是tomcat安装位置

tomcat内部设置

1.从入口org.apache.catalina.startup.main方法开始跟踪,

  1. Bootstrap bootstrap = new Bootstrap();
  2. try {
  3. bootstrap.init();
  4. } catch (Throwable t) {
  5. handleThrowable(t);
  6. t.printStackTrace();
  7. return;
  8. }
  9. daemon = bootstrap;

这是tomcat7第一次启动时最先执行的代码。

2.进入init,就是一堆初始化了,最先执行的

  1. // Set Catalina path
  2. setCatalinaHome();
  3. setCatalinaBase();

3.进入setCatalinaHome()

  1. if (System.getProperty(Globals.CATALINA_HOME_PROP) != null)
  2. return;
  3. File bootstrapJar =
  4. new File(System.getProperty("user.dir"), "bootstrap.jar");
  5. if (bootstrapJar.exists()) {
  6. try {
  7. System.setProperty
  8. (Globals.CATALINA_HOME_PROP,
  9. (new File(System.getProperty("user.dir"), ".."))
  10. .getCanonicalPath());
  11. } catch (Exception e) {
  12. // Ignore
  13. System.setProperty(Globals.CATALINA_HOME_PROP,
  14. System.getProperty("user.dir"));
  15. }
  16. } else {
  17. System.setProperty(Globals.CATALINA_HOME_PROP,
  18. System.getProperty("user.dir"));
  19. }

它的步骤是:

1.从system中取,如果有就直接返回。

2.如果bootstrap.jar在当前工作目录,就取上一级,返回。

3.如果bootstrap.jar没有在当前工作目录,那么就设置CATALINA_HOME为当前工作目录

4.进入setCatalinaBase()

  1. if (System.getProperty(Globals.CATALINA_BASE_PROP) != null)
  2. return;
  3. if (System.getProperty(Globals.CATALINA_HOME_PROP) != null)
  4. System.setProperty(Globals.CATALINA_BASE_PROP,
  5. System.getProperty(Globals.CATALINA_HOME_PROP));
  6. else
  7. System.setProperty(Globals.CATALINA_BASE_PROP,
  8. System.getProperty("user.dir"));

它的步骤是:

1.从system中取,如果有就直接返回。

2.如果已经设置了CATALINA_HOME,就设置CATALINA_BASECATALINA_HOME,返回。

3.设置CATALINA_BASE为当前工作目录

总结

1.如果我们安装的tomcat就只有一个实例,就只需要配置CATALINA_HOME

2.有时候项目太多,它们相互之间的一些配置又有些不同,我们就可以考虑用多个实例,而不必去复制多个tomcat了。实例配置了之后,在启动时只需要指定CATALINA_BASE就可以了

[tomcat7源码学习]初始化之catalina.home和catalina.base(转)的更多相关文章

  1. Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

    前言 在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程. 入口 从 ...

  2. SpringBoot源码学习系列之嵌入式Servlet容器

    目录 1.博客前言简单介绍 2.定制servlet容器 3.变换servlet容器 4.servlet容器启动原理 SpringBoot源码学习系列之嵌入式Servlet容器启动原理 @ 1.博客前言 ...

  3. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  4. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  5. 【iScroll源码学习04】分离IScroll核心

    前言 最近几天我们前前后后基本将iScroll源码学的七七八八了,文章中未涉及的各位就要自己去看了 1. [iScroll源码学习03]iScroll事件机制与滚动条的实现 2. [iScroll源码 ...

  6. 【iScroll源码学习03】iScroll事件机制与滚动条的实现

    前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...

  7. 【iScroll源码学习02】分解iScroll三个核心事件点

    前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...

  8. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  9. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

随机推荐

  1. KVC实现原理简介

    KVC,全称:Key-Value-Coding. KVC运用了isa-swizzling技术.isa-swizzling就是类型混合指针机制.KVC主要通过isa-swizzling来实现其内部定位查 ...

  2. C语言-09-文件操作

    文件类型 文本文件(ASCII) 简单的文本文件,可用任何文字处理程序阅读 二进制文件 包含 在ASCII及扩展ASCII字符中编写的数据或程序指令 的文件,通常图形文件及文字处理程序等计算机程序都属 ...

  3. python super

    http://hi.baidu.com/thinkinginlamp/item/3095e2f52c642516ce9f32d5 Python中对象方法的定义很怪异,第一个参数一般都命名为self(相 ...

  4. SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化

    网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法. 由于较为复杂,所以使用了ASF框架.但是也会对用到的库函数的实现做一个介绍 ...

  5. nodejs 安装及部署遇到的问题

    Error: ENOENT, stat 'C:\Users\PC_Name\AppData\Roaming\npm PC_Name是机器名 解决方法:在Roaming文件夹下创建一个叫npm的空文件夹 ...

  6. 关于点击ztree的节点将页面生成到easyui的新增选项卡(easyui-tabs)时,总是在浏览器中生成一个新的页面的问题

    最近的项目中用到了easyui,还有ztree菜单.在这里将我遇到的一些问题写出来算是做个笔记吧. 这是我头一次在博客园里分享代码,我的处女作,写的不好的地方还望各位见谅! 由于很久没有写过前台的东西 ...

  7. Load xlsx in a folder to RDBMS table with Talend

    Step 1 . Use tFileList component to get the file list. And set proper property. Step 2. Use tFileInp ...

  8. Excel scientific notation issue

        This is a known issue, you can find more in internet. Excel will treat text(can display with num ...

  9. Chorme中启动阿里旺旺误点取消启动并记住选择,如何更改。

    今天在Chorme中启动阿里旺旺误点取消启动并记住选择,然后如何也点不开了.从网上找到了一种解决方法: 找到路径   C:\Users\\AppData\Local\Google\Chrome\Use ...

  10. HDU 4121 Xiangqi --模拟

    题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅. 解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的 ...