当部署Java Web项目的时候我们可以把全部目录打包成一个单独jar或者war包,然后把这个.jar或者.war文件放在tomcat的webapps目录下。
当我们重新启动tomcat就可以访问这个项目了,这样一个war包的形式给传输、存储和部署给我们带来的好处,但是也带来一个问题就是把项目一些配置文件.xml,.properties等也打包进去了,如果想改这些配置文件里面的某些属性值需要重新打包。我个时候我想有没有一种方式可以配置信息独立出来,这样更改配置不用重要打war包,这会大大提高的项目的可维护性。
下面介绍一下在Spring中配置信息独立于jar包或者war包的方法。
Spring读取properties实例可以参数我之前写的文章:Spring MVC利用读取properties实现程序配置参数
一、Spring的util配置注入方式
下面我还是利用
Controller代码:
package com.lanhusoft.web.controllers;
import com.lanhusoft.config.SysConfig;
import com.lanhusoft.model.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by Administrator on 2016/11/10.
*/
@Controller
public class DemoController {
@Autowired
private SysConfig sysConfig;
@RequestMapping("demo")
@ResponseBody
public Message say() {
Message message = new Message();
message.setName("lanhusoft");
message.setText("hello," + sysConfig.getResHostPrefix());
return message;
}
}
1、更改spring的xml配置文件
原来的:
改为:
找到tomcat安装目录的bin下面的catalina.bat文件找到
"JAVA_OPTS=
加入增加:
-DAPP_HOME=F:\App\conf\LanhuRest\
也就是放配置文件的目录。
最效果如下图:
注意:
这里是windows操作系统,所以改的是catalina.bat文件,如果是linux就改catalina.sh,然后把路径做对应调整。
2、生成war包并把它拷贝到tomcat的webapps目录下
3、为了不让tomcat启动时自动解开.war包,修改server.xml的unpackWARs为false。
4、建立独立.war的properties文件
内容为:
resHostPrefix=http://lanhusoft.com/
5、启动tomcat,运行startup.bat,查看效果。
6、修改目录F:\App\conf\LanhuRest下的sysConfig.properties把改为:
resHostPrefix=http://www.lanhusoft.com/
重启tomcat再次查http://localhost:8081/LanhuRest_war/demo.json
可以从上面看到修改生效了。
二、占位--使用PropertyPlaceholderConfigurer
使用PropertyPlaceholderConfigurer类载入外部配置
在Spring项目中,你可能需要从properties文件中读入配置注入到bean中,例如数据库连接信息,memcached server的地址端口信息等,这些配置信息最好独立于jar包或者war包,这样便于修改配置。Spring提供了PropertyPlaceholderConfigurer类来处理这件事情。
例如,要载入配置文件中的mysql配置信息:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mypage
jdbc.username=root
jdbc.password=123456
我们需要在spring配置文件中定义PropertyPlaceholderConfigurer的location属性,这个location指向配置文件的位置:
在上面的例子中PropertyPlaceholderConfigurer类的systemPropertiesModeName的属性是SYSTEM_PROPERTIES_MODE_OVERRIDE这意味着可以从jvm虚拟机的参数中获得配置信息。
配置location的值中的${APP_HOME}可以根据环境不同设置不同的值,例如在开发环境,设置开发环境的目录,而在线上环境就要配置线上配置文件的路径了。
对于jar包文件,需要在启动jar包时指定APP_HOME的值,例如:
java -classpath test.jar -DAPP_HOME=/data0/conf cn.outofmemory.App
而对于运行在tomcat容器中的war包,需要修改下tomcat目录下的bin/catalina.sh文件,在此文件中添加或者修改如下变量的值:
JAVA_OPTS="-Xms2560m -Xmx5120m -DAPP_HOME=/application/outofmemory.cn/conf/"
注意-Xms2560m -Xmx5120m是为了修改虚拟机的内存值,-DAPP_HOME才影响配置文件位置。
给PropertyPlaceholderConfigurer指定必要的属性之后就可以通过${variable}的形式将配置文件中的值植入到bean中了。
如果你希望将配置文件放在jar包或者war包内,那么需要将location中的file:去掉,例如在war包中通常会放在/WEB-INF/conf路径下,那么可以这么写:
PS:为什么我们把war放在tomcat的webapps目录下就能访问的呢?
当启动tomcat的时候就会根据配置怎么解压或者不解压这个.war包,不过不解压也要以访问。打开conf下面的server.xml可以看到如下配置。
unpackWARs="true" autoDeploy="true">
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
可以看到,appBase的值为webapps,且uppackWAR属性是true,也就是要解压war包。
参考: