[tomcat7源码学习]初始化之catalina.home和catalina.base(转)
我们在代码中为了获取某个配置文件路径下的文件经常会这么写
- String tomcatPath = System.getProperty("catalina.home") + "/webapps/axis2/WEB-INF/conf/";
- tomcatPath = tomcatPath.replace("/", File.separator); //使用此方法是为了区分unix系统与windows,
- //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
):
- /**
- * Name of the system property containing
- * the tomcat product installation path
- */
- public static final String CATALINA_HOME_PROP = "catalina.home";
- /**
- * Name of the system property containing
- * the tomcat instance installation path
- */
- public static final String CATALINA_BASE_PROP = "catalina.base";
就两个差异,一个是product,一个是instance。
再看一下RUNNING.txt中的说明
- ==================================================
- Advanced Configuration - Multiple Tomcat Instances
- ==================================================
- In many circumstances, it is desirable to have a single copy of a Tomcat
- binary distribution shared among multiple users on the same server. To make
- this possible, you can set the CATALINA_BASE environment variable to the
- directory that contains the files for your 'personal' Tomcat instance.
- When running with a separate CATALINA_HOME and CATALINA_BASE, the files
- and directories are split as following:
- In CATALINA_BASE:
- * bin - Only the following files:
- * setenv.sh (*nix) or setenv.bat (Windows),
- * tomcat-juli.jar
- The setenv scripts were described above. The tomcat-juli library
- is documented in the Logging chapter in the User Guide.
- * conf - Server configuration files (including server.xml)
- * lib - Libraries and classes, as explained below
- * logs - Log and output files
- * webapps - Automatically loaded web applications
- * work - Temporary working directories for web applications
- * temp - Directory used by the JVM for temporary files (java.io.tmpdir)
- In CATALINA_HOME:
- * bin - Startup and shutdown scripts
- The following files will be used only if they are absent in
- CATALINA_BASE/bin:
- setenv.sh (*nix), setenv.bat (Windows), tomcat-juli.jar
- * lib - Libraries and classes, as explained below
- * endorsed - Libraries that override standard "Endorsed Standards"
- libraries provided by JRE. See Classloading documentation
- in the User Guide for details.
- By default this "endorsed" directory is absent.
大概意思就是
CATALINA_BASE
:是实例配置位置,也就是一个tomcat可以配置多个实例,实例里面有自己的配置CATALINA_HOME
:是tomcat安装位置
tomcat内部设置
1.从入口org.apache.catalina.startup.main方法开始跟踪,
- Bootstrap bootstrap = new Bootstrap();
- try {
- bootstrap.init();
- } catch (Throwable t) {
- handleThrowable(t);
- t.printStackTrace();
- return;
- }
- daemon = bootstrap;
这是tomcat7第一次启动时最先执行的代码。
2.进入init,就是一堆初始化了,最先执行的
- // Set Catalina path
- setCatalinaHome();
- setCatalinaBase();
3.进入setCatalinaHome()
- if (System.getProperty(Globals.CATALINA_HOME_PROP) != null)
- return;
- File bootstrapJar =
- new File(System.getProperty("user.dir"), "bootstrap.jar");
- if (bootstrapJar.exists()) {
- try {
- System.setProperty
- (Globals.CATALINA_HOME_PROP,
- (new File(System.getProperty("user.dir"), ".."))
- .getCanonicalPath());
- } catch (Exception e) {
- // Ignore
- System.setProperty(Globals.CATALINA_HOME_PROP,
- System.getProperty("user.dir"));
- }
- } else {
- System.setProperty(Globals.CATALINA_HOME_PROP,
- System.getProperty("user.dir"));
- }
它的步骤是:
1.从system中取,如果有就直接返回。
2.如果bootstrap.jar在当前工作目录,就取上一级,返回。
3.如果bootstrap.jar没有在当前工作目录,那么就设置
CATALINA_HOME
为当前工作目录
4.进入setCatalinaBase()
- if (System.getProperty(Globals.CATALINA_BASE_PROP) != null)
- return;
- if (System.getProperty(Globals.CATALINA_HOME_PROP) != null)
- System.setProperty(Globals.CATALINA_BASE_PROP,
- System.getProperty(Globals.CATALINA_HOME_PROP));
- else
- System.setProperty(Globals.CATALINA_BASE_PROP,
- System.getProperty("user.dir"));
它的步骤是:
1.从system中取,如果有就直接返回。
2.如果已经设置了
CATALINA_HOME
,就设置CATALINA_BASE
为CATALINA_HOME
,返回。3.设置
CATALINA_BASE
为当前工作目录
总结
1.如果我们安装的tomcat就只有一个实例,就只需要配置CATALINA_HOME
2.有时候项目太多,它们相互之间的一些配置又有些不同,我们就可以考虑用多个实例,而不必去复制多个tomcat了。实例配置了之后,在启动时只需要指定CATALINA_BASE
就可以了
[tomcat7源码学习]初始化之catalina.home和catalina.base(转)的更多相关文章
- Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
前言 在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程. 入口 从 ...
- SpringBoot源码学习系列之嵌入式Servlet容器
目录 1.博客前言简单介绍 2.定制servlet容器 3.变换servlet容器 4.servlet容器启动原理 SpringBoot源码学习系列之嵌入式Servlet容器启动原理 @ 1.博客前言 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- 【iScroll源码学习04】分离IScroll核心
前言 最近几天我们前前后后基本将iScroll源码学的七七八八了,文章中未涉及的各位就要自己去看了 1. [iScroll源码学习03]iScroll事件机制与滚动条的实现 2. [iScroll源码 ...
- 【iScroll源码学习03】iScroll事件机制与滚动条的实现
前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...
- 【iScroll源码学习02】分解iScroll三个核心事件点
前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...
- spring源码学习之路---深入AOP(终)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...
随机推荐
- KVC实现原理简介
KVC,全称:Key-Value-Coding. KVC运用了isa-swizzling技术.isa-swizzling就是类型混合指针机制.KVC主要通过isa-swizzling来实现其内部定位查 ...
- C语言-09-文件操作
文件类型 文本文件(ASCII) 简单的文本文件,可用任何文字处理程序阅读 二进制文件 包含 在ASCII及扩展ASCII字符中编写的数据或程序指令 的文件,通常图形文件及文字处理程序等计算机程序都属 ...
- python super
http://hi.baidu.com/thinkinginlamp/item/3095e2f52c642516ce9f32d5 Python中对象方法的定义很怪异,第一个参数一般都命名为self(相 ...
- SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化
网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法. 由于较为复杂,所以使用了ASF框架.但是也会对用到的库函数的实现做一个介绍 ...
- nodejs 安装及部署遇到的问题
Error: ENOENT, stat 'C:\Users\PC_Name\AppData\Roaming\npm PC_Name是机器名 解决方法:在Roaming文件夹下创建一个叫npm的空文件夹 ...
- 关于点击ztree的节点将页面生成到easyui的新增选项卡(easyui-tabs)时,总是在浏览器中生成一个新的页面的问题
最近的项目中用到了easyui,还有ztree菜单.在这里将我遇到的一些问题写出来算是做个笔记吧. 这是我头一次在博客园里分享代码,我的处女作,写的不好的地方还望各位见谅! 由于很久没有写过前台的东西 ...
- 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 ...
- Excel scientific notation issue
This is a known issue, you can find more in internet. Excel will treat text(can display with num ...
- Chorme中启动阿里旺旺误点取消启动并记住选择,如何更改。
今天在Chorme中启动阿里旺旺误点取消启动并记住选择,然后如何也点不开了.从网上找到了一种解决方法: 找到路径 C:\Users\\AppData\Local\Google\Chrome\Use ...
- HDU 4121 Xiangqi --模拟
题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅. 解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的 ...