webapp如何从tomcat的conf目录中加载配置?

来源:互联网 发布:为数据而生 周涛 pdf 编辑:程序博客网 时间:2024/04/30 13:04

问题

WebApp中难免访问tomcat中的资源,比如要从conf中读取配置文件,将日志写到logs目录中。使用命令 ./startup.sh 可以启动tomcat,但是不同的启动方式,对工作目录影响很大。

比如在bin目录中 ./startup.sh 那么工作目录将是bin目录。此时的 .. 目录是tomcat根目录1,相应的:

../conf ---> conf../logs ---> logs 

但是如果是在根目录中执行 ./bin/startup.sh 那么工作目录将变成tomcat的安装目录,此时:

./conf ---> conf./logs ---> logs

如果我们在log4j的配置文件中把日志文件配置成为../logs/app.log,那么对于第一种运行方式,我们会发现日志出现在${catalina.base}/logs目录中。但是如果以第二种方式启动tomcat,我们会发现日志出现${catalina.base}/../logs目录中。于是在做配置的时候,最终访问的是哪个文件就变得十分不确定了。

问题是,如何确定访问tomcat中conf目录中的某配置文件,或者把日志确定设在logs目录中呢?

tomcat机制分析

tomcat提供了个渠道,让app知道运行它的tomcat在哪。tomcat会提供一系统形如catalina.xxx的系统属性2。其中有catalina.homecatalina.base可以用来确定当前tomcat的目录。一般来说:

  • catalina.home表示tomcat的安装目录,是tomcat代码所在的地方。
  • catalina.base表示tomcat的运行目录,是webapp相关的数据所处的地方。

如果直接以./startup.sh的方式运行tomcat,那么这两个变量将指向同一个值,它就是tomcat的安装目录。但是如果在同一台机子上,同时存在多个tomcat实例,那么很可能的情况就是它们的catalina.home相同,而catalina.base各处不同。见tomcat多实例配置

在tomcat多实例的情况下,一般来说会以下面这样的形式存在。

<catalina_home>|--- <bin>:tomcat本身|--- <lib>:公共的库`--- <conf>:公共配置<catalina_base>|--- <bin>:只有启动脚本|--- <conf>:服务器的配置,比如端口,权限等等,以及一些webapp使用的配置。|--- <logs>|--- <webapps>|--- <work>`--- <tmp>

所以我们期望的根目录将是catalina.base指定的目录。

解决方案

对于可以从System.properties中加载变量的,都可以使用${catalina.base}表示当前的tomcat的根目录。(比如web.xml,log4j.properties,springApplicationContext.xml等文件)

以下是一段log4j.properties文件的配置,它会将app.log日志文件保存在tomcat中的conf目录中。

log4j.appender.file=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.file.file=${catalina.base}/logs/app.loglog4j.appender.file.DatePattern='.'yyyyMMddlog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss SSS} [%p] %c{1} %m%n

代码中可以通过下面的代码从tomcat的相应目录里加载相关内容:

File conf = new File(System.getProperty("catalina.base"), "conf");File appConf = new File(conf, "app.properties");Properties p = loadProperties(appConf);

  1. tomcat根目录,我们表示为${catalina.base}。相应的它里面的conf目录也可以表示成${catalina.base}/conf,以此类推。 ↩
  2. 系统属性可以通过System.getProperty(...)获取。 ↩
0 0
原创粉丝点击