web项目部署在不同环境中需要修改配置文件的解决方法
web项目部署中存在的配置文件问题:
web项目以war包的形式,部署在tomcat中,同时项目需要访问一些其他的东东,例如访问数据库,调用别的项目的API。在开发中,这些需要访问的外部地址通常以配置文件的形式存在于项目中。如下图:
在更换项目的部署环境后,或者调用的外部应用地址发生变化,就需要更改配置文件。
最直接的问题:
发布了一个测试包,放在测试环境上,测试通过之后,要将测试包发布到生产环境中,此时测试环境与生产环境的各种配置的地址是不同的,解决方案有两种
(1)将配置文件修改为生产环境的配置,重新打包。
(2)将测试环境的包,升级到生产环境后,修改配置文件为生产环境的配置文件。
不管是哪种方式都是存在风险的。对于(1)来说升级到生产环境的包并不是测试通过的包;对于(2)来说增加了人工成本和出错概率。
解决方案:
如果配置文件中,需要变化的地址使用变量的形式,项目在被部署到不同的环境中后,读取各自环境中的变量,是不是就可以解决这个问题了呢。
步骤:
(1)在环境变量中增加一个参数配置,tomcat启动后或者项目启动后可以加载改参数
(2)将项目中的配置文件修改成已经定义的变量
(3)项目的代码部分在加载配置文件的时候,可以自动替换掉变量
具体实现:
(1)修改tomcat的Catalina.sh文件
在cygwin=false上面增加JAVA_OPTS="-DbaseDomain=xxxxxx"
设置了变量之后,在java的项目中可以使用System.getProperty("baseDomain")来获取。
(2)修改项目的配置文件,需要修改的内容使用${baseDomain}替换。
(3)项目中解析${baseDomain}
配置完成之后,即可初步实现build once,run any enviroment了。
--------------
附上解析配置文件中${baseDomain}的代码
import java.util.Properties; import org.apache.log4j.helpers.LogLog; public class OptionConverterUtil {
static String DELIM_START = "${";
static char DELIM_STOP = '}';
static int DELIM_START_LEN = 2;
static int DELIM_STOP_LEN = 1; public static
String substVars(String val, Properties props) throws
IllegalArgumentException { StringBuffer sbuf = new StringBuffer(); int i = 0;
int j, k; while(true) {
j=val.indexOf(DELIM_START, i);
if(j == -1) {
// no more variables
if(i==0) { // this is a simple string
return val;
} else { // add the tail string which contails no variables and return the result.
sbuf.append(val.substring(i, val.length()));
return sbuf.toString();
}
} else {
sbuf.append(val.substring(i, j));
k = val.indexOf(DELIM_STOP, j);
if(k == -1) {
throw new IllegalArgumentException('"'+val+
"\" has no closing brace. Opening brace at position " + j
+ '.');
} else {
j += DELIM_START_LEN;
String key = val.substring(j, k);
// first try in System properties
String replacement = getSystemProperty(key, null);
// then try props parameter
if(replacement == null && props != null) {
replacement = props.getProperty(key);
} if(replacement != null) {
// Do variable substitution on the replacement string
// such that we can solve "Hello ${x2}" as "Hello p1"
// the where the properties are
// x1=p1
// x2=${x1}
String recursiveReplacement = substVars(replacement, props);
sbuf.append(recursiveReplacement);
}
i = k + DELIM_STOP_LEN;
}
}
}
} public static String getSystemProperty(String key, String def) {
try {
return System.getProperty(key, def);
} catch(Throwable e) { // MS-Java throws com.ms.security.SecurityExceptionEx
LogLog.debug("Was not allowed to read system property \""+key+"\".");
return def;
}
}
}
在第三步配置文件参数解析操作过程中参考了log日志的做法,解析方法也是从log4j的源代码中copy出来的。
---------------
看了一下spring-boot,如果使用spring-boot,则不需要上述设置,直接配置不同的配置文件。spring-boot会根据不同的环境加载不同的配置文件,原理感觉和上述类似。
web项目部署在不同环境中需要修改配置文件的解决方法的更多相关文章
- 将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法
本博客主要是说一下,,如何将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法. 1.先在阿里云上购买一台阿里云服务器(ECS云服务器): 2.远程连接上该服务器,在 ...
- Jboss项目部署出现java.lang.UnsupportedClassVersionError 问题的解决方法
出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误. 解决 ...
- eclipse修改web项目部署路径 wtpwebapps webapps 的设置
eclipse修改web项目部署路径 wtpwebapps webapps 的设置,在添加完server------>tomcat后,到server控制台进行设置 eclipse默认的部署 ...
- eclipse中maven web项目部署时缺少classes文件或者resources文件
写这篇博客的原因 问题描述 昨天发现eclipse中maven web项目部署时缺少classes文件或者resources文件 本来以为是很常见的原因, 依次检查"Java Build P ...
- Maven Web项目部署到Tomcat下问题
但是也遇到了很多问题,下面记录一下Web项目部署到Tomcat下的问题 1.普通的WEB项目,就是虽然是用maven搭建的,但是没有使用profiles.xml文件来配置参数.这样的项目可以通过以下的 ...
- Spring整合Redis&JSON序列化&Spring/Web项目部署相关
几种JSON框架用法和效率对比: https://blog.csdn.net/sisyphus_z/article/details/53333925 https://blog.csdn.net/wei ...
- Linux06 /Python web项目部署
Linux06 /Python web项目部署 目录 Linux06 /Python web项目部署 1. 部署方式 2. 纯后端代码部署/CRM为例 1. 部署方式 2. crm项目详细部署步骤 3 ...
- Web项目部署指南
Web项目部署指南 本文记录了部署Vue项目到阿里云服务器上的过程,其中云服务器的操作系统是CentOS 7,Web服务器用的是nginx.因为项目涉及发送异步请求,而由Flask编写的后端应用监听的 ...
- eclipse中将web项目部署到tomcat
eclipse中将web项目部署到tomcat. myeclipse部署WEB项目到tomcat比较方便,但eclipse貌似默认是不会替你将web自动部署到tomcat下的.你Run as该web项 ...
随机推荐
- 3130: [Sdoi2013]费用流
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络流方案 ...
- android studio InnerClass annotations are missing corresponding EnclosingMember annotations. Such InnerClass annota
如果 你的项目中使用了注解插件 比如butterknife 升级3.1之后打包编译 出现以下错误提示 InnerClass annotations are missing correspondi ...
- Could not find class com.google.gson.Gson
在Android开发中使用gson解析json字符串,出现异常:java.lang.classnotfoundexception:com.google.gson.Gson.解决方案如下: 这个异常的怪 ...
- header头
<?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...
- 使用filter对请求设置编码
一.复习 加强方法: 1)继承 2)装饰模式 3)动态代理. 使用装饰模式: 1)要求装饰者和被装饰者实现同一个接口或者继承同一个类. 2)装饰者要求被装饰者的引用. 3)对于要加强的方法进行加强,对 ...
- HDU 2647 Reward(拓扑排序,vector实现邻接表)
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Features + Git + Drush,打造你的Drupal开发与维护标准工作流
还在为如何将本地的开发工作如何部署到生产环境而皱眉头?本文以实战历程教你如何一步步将你的工作成果从开发环境部署到生产环境. 如题所示,需要用到Features, Git, Drush:如果你还不知道他 ...
- allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转)
allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转) Autosilk top, Silkscreen top 和Assembly t ...
- 第17章 EXTI—外部中断/事件控制器
第17章 EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- ADO.NET TransactionScope使用说明(转载)
TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间.它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物.使用之前必须添 ...