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}的代码

  1. import java.util.Properties;
  2.  
  3. import org.apache.log4j.helpers.LogLog;
  4.  
  5. public class OptionConverterUtil {
  6. static String DELIM_START = "${";
  7. static char DELIM_STOP = '}';
  8. static int DELIM_START_LEN = 2;
  9. static int DELIM_STOP_LEN = 1;
  10.  
  11. public static
  12. String substVars(String val, Properties props) throws
  13. IllegalArgumentException {
  14.  
  15. StringBuffer sbuf = new StringBuffer();
  16.  
  17. int i = 0;
  18. int j, k;
  19.  
  20. while(true) {
  21. j=val.indexOf(DELIM_START, i);
  22. if(j == -1) {
  23. // no more variables
  24. if(i==0) { // this is a simple string
  25. return val;
  26. } else { // add the tail string which contails no variables and return the result.
  27. sbuf.append(val.substring(i, val.length()));
  28. return sbuf.toString();
  29. }
  30. } else {
  31. sbuf.append(val.substring(i, j));
  32. k = val.indexOf(DELIM_STOP, j);
  33. if(k == -1) {
  34. throw new IllegalArgumentException('"'+val+
  35. "\" has no closing brace. Opening brace at position " + j
  36. + '.');
  37. } else {
  38. j += DELIM_START_LEN;
  39. String key = val.substring(j, k);
  40. // first try in System properties
  41. String replacement = getSystemProperty(key, null);
  42. // then try props parameter
  43. if(replacement == null && props != null) {
  44. replacement = props.getProperty(key);
  45. }
  46.  
  47. if(replacement != null) {
  48. // Do variable substitution on the replacement string
  49. // such that we can solve "Hello ${x2}" as "Hello p1"
  50. // the where the properties are
  51. // x1=p1
  52. // x2=${x1}
  53. String recursiveReplacement = substVars(replacement, props);
  54. sbuf.append(recursiveReplacement);
  55. }
  56. i = k + DELIM_STOP_LEN;
  57. }
  58. }
  59. }
  60. }
  61.  
  62. public static String getSystemProperty(String key, String def) {
  63. try {
  64. return System.getProperty(key, def);
  65. } catch(Throwable e) { // MS-Java throws com.ms.security.SecurityExceptionEx
  66. LogLog.debug("Was not allowed to read system property \""+key+"\".");
  67. return def;
  68. }
  69. }
  70. }

在第三步配置文件参数解析操作过程中参考了log日志的做法,解析方法也是从log4j的源代码中copy出来的。

---------------

看了一下spring-boot,如果使用spring-boot,则不需要上述设置,直接配置不同的配置文件。spring-boot会根据不同的环境加载不同的配置文件,原理感觉和上述类似。

web项目部署在不同环境中需要修改配置文件的解决方法的更多相关文章

  1. 将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法

    本博客主要是说一下,,如何将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法. 1.先在阿里云上购买一台阿里云服务器(ECS云服务器): 2.远程连接上该服务器,在 ...

  2. Jboss项目部署出现java.lang.UnsupportedClassVersionError 问题的解决方法

    出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误. 解决 ...

  3. eclipse修改web项目部署路径 wtpwebapps webapps 的设置

    eclipse修改web项目部署路径 wtpwebapps   webapps  的设置,在添加完server------>tomcat后,到server控制台进行设置 eclipse默认的部署 ...

  4. eclipse中maven web项目部署时缺少classes文件或者resources文件

    写这篇博客的原因 问题描述 昨天发现eclipse中maven web项目部署时缺少classes文件或者resources文件 本来以为是很常见的原因, 依次检查"Java Build P ...

  5. Maven Web项目部署到Tomcat下问题

    但是也遇到了很多问题,下面记录一下Web项目部署到Tomcat下的问题 1.普通的WEB项目,就是虽然是用maven搭建的,但是没有使用profiles.xml文件来配置参数.这样的项目可以通过以下的 ...

  6. Spring整合Redis&JSON序列化&Spring/Web项目部署相关

    几种JSON框架用法和效率对比: https://blog.csdn.net/sisyphus_z/article/details/53333925 https://blog.csdn.net/wei ...

  7. Linux06 /Python web项目部署

    Linux06 /Python web项目部署 目录 Linux06 /Python web项目部署 1. 部署方式 2. 纯后端代码部署/CRM为例 1. 部署方式 2. crm项目详细部署步骤 3 ...

  8. Web项目部署指南

    Web项目部署指南 本文记录了部署Vue项目到阿里云服务器上的过程,其中云服务器的操作系统是CentOS 7,Web服务器用的是nginx.因为项目涉及发送异步请求,而由Flask编写的后端应用监听的 ...

  9. eclipse中将web项目部署到tomcat

    eclipse中将web项目部署到tomcat. myeclipse部署WEB项目到tomcat比较方便,但eclipse貌似默认是不会替你将web自动部署到tomcat下的.你Run as该web项 ...

随机推荐

  1. Python中让MySQL查询结果返回字典类型的方法

    import pymysql host='localhost' user='root' passwd='root' port=3306 db='test' db=pymysql.connect( ho ...

  2. 【转】PHP解析带CDATA的XML方法

    XML文件,如下 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName& ...

  3. pam_frpintd.so 错误修复

    PAM unable to dlopen(/lib64/security/pam_fprintd.so): /lib64/security/pam_fprintd.so: cannot open sh ...

  4. Jenkins与Github集成

    Jenkins目前是手动进行项目构建的,如何才能做到Github并持续集成呢? 配置前要求: 1.Jenkins已经安装Github插件 2.Jenkins服务器已经拥有一个公网IP地址 第一步:配置 ...

  5. Kubernetes1.91(K8s)安装部署过程(三)--创建高可用etcd集群

    这里的etcd集群复用我们测试的3个节点,3个node都要安装并启动,注意修改配置文件 1.TLS认证文件分发:etcd集群认证用,除了本机有,分发到其他node节点 scp ca.pem kuber ...

  6. MySQL数据类型字节长度

    1.字符串 char(n): n 字节长度 varchar(n): 如果是 utf8 编码, 则是 3 n + 2字节; 如果是 utf8mb4 编码, 则是 4 n + 2 字节. 2.数值类型: ...

  7. 【转】微信开发-NATAPP的使用

    1.为什么使用natapp 1.1 在进行微信公众号开发时,我们需要搭建网站,并且有可能需要将项目部署到外网可访问的域名上,并且随时都有可能修改网站内容进行调试.如果能够将内网ip映射到外网上,大大方 ...

  8. easyui的datagrid

    datagrid数据的绑定方式: 1)data 后跟数据行的json串 2)url 后跟{"total":,"rows":,"foot":} ...

  9. 第五节 HTML&CSS -- 关于浮动和清除浮动的解说,以及两个大坑不要踩

    1.随便唠叨几句   这一节课我会对浮动元素和怎样清除浮动相关的技术进行一个讲解,同时,我会列举一些我们前端开发中常见的坑,希望大家以后不要在这些地方犯错.在开始今天的课程之前,有一个东西我需要先讲一 ...

  10. Caffe学习系列——工具篇:神经网络模型结构可视化

    Caffe学习系列——工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py ...