Maven配置本地环境和线上环境

一、问题背景

有时候,我们在开发和部署的时候,有很多配置文件的数据是不一样的,比如数据库的properties文件等等每次部署或者开发都要改配置文件太麻烦了,这个时候,就需要用到maven的profile配置了

Github源码:https://github.com/jxq0816/mvn-profile-demo

二、代码

1、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.week7i.share</groupId>
  <artifactId>mvn-profile</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>mvn-profile Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <commons-lang3.version>3.3.2</commons-lang3.version>
    <commons-io.version>2.4</commons-io.version>
    <guava.version>17.0</guava.version>
    <junit.version>4.11</junit.version>
    <spring.version>4.3.6.RELEASE</spring.version>
  </properties>
  <dependencies>
    <!-- GENERAL UTILS begin -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>${commons-lang3.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>${commons-io.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- google java lib -->
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>${guava.version}</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>

  </dependencies>

  <build>
    <finalName>mvn-profile</finalName>
    <resources>
      <!--加载环境变量的目录-->
      <resource>
        <directory>src/main/resources/${env}</directory>
      </resource>
      <!--加载其他配置文件-->
      <resource>
        <directory>src/main/resources</directory>
        <excludes>
          <exclude>local/*</exclude>
          <exclude>online/*</exclude>
        </excludes>
      </resource>

    </resources>
  </build>

  <profiles>
    <!--开发环境-->
    <profile>
      <id>local</id>
      <properties>
        <env>local</env>
      </properties>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>
    <!--生产环境-->
    <profile>
      <id>online</id>
      <properties>
        <env>online</env>
      </properties>
    </profile>
  </profiles>
</project>

2. 配置 local install

运行local install,会在target看到本地的数据库配置文件加载成功

3. 配置 maven online install

运行online install,会在target看到线上的数据库配置文件加载成功

三、附加功能(读取配置文件)

1、Global.java (全局配置类)

package com.weeking.share.config;

import com.google.common.collect.Maps;
import com.weeking.share.util.PropertiesLoader;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;

/**
 * 全局配置类
 * Created by jiangxingqi on 2017/7/27.
 */
public class Global {

    /**
     * 保存全局属性值
     */
    private static Map<String, String> map = Maps.newHashMap();

    /**
     * 属性文件加载对象
     */
    private static PropertiesLoader loader = new PropertiesLoader("jdbc.properties");

    /**
     * 获取配置
     */
    public static String getConfig(String key) {
        String value = map.get(key);
        if (value == null){
            value = loader.getProperty(key);
            map.put(key, value != null ? value : StringUtils.EMPTY);
        }
        return value;
    }
}

2. PropertiesLoader.java (配置文件读取类)

package com.weeking.share.util;

import org.apache.commons.io.IOUtils;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

import java.io.IOException;
import java.io.InputStream;
import java.util.NoSuchElementException;
import java.util.Properties;


/**
 * Created by jiangxingqi on 2017/7/27.
 */
public class PropertiesLoader {

    private static ResourceLoader resourceLoader = new DefaultResourceLoader();

    private final Properties properties;

    public PropertiesLoader(String... resourcesPaths) {
        properties = loadProperties(resourcesPaths);
    }

    public Properties getProperties() {
        return properties;
    }

    /**
     * 取出Property,但以System的Property优先,取不到返回空字符串.
     */
    private String getValue(String key) {
        String systemProperty = System.getProperty(key);
        if (systemProperty != null) {
            return systemProperty;
        }
        if (properties.containsKey(key)) {
            return properties.getProperty(key);
        }
        return "";
    }

    /**
     * 取出String类型的Property,但以System的Property优先,如果都为Null则抛出异常.
     */
    public String getProperty(String key) {
        String value = getValue(key);
        if (value == null) {
            throw new NoSuchElementException();
        }
        return value;
    }

    /**
     * 取出String类型的Property,但以System的Property优先.如果都为Null则返回Default值.
     */
    public String getProperty(String key, String defaultValue) {
        String value = getValue(key);
        return value != null ? value : defaultValue;
    }

    /**
     * 取出Integer类型的Property,但以System的Property优先.如果都为Null或内容错误则抛出异常.
     */
    public Integer getInteger(String key) {
        String value = getValue(key);
        if (value == null) {
            throw new NoSuchElementException();
        }
        return Integer.valueOf(value);
    }

    /**
     * 取出Integer类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容错误则抛出异常
     */
    public Integer getInteger(String key, Integer defaultValue) {
        String value = getValue(key);
        return value != null ? Integer.valueOf(value) : defaultValue;
    }

    /**
     * 取出Double类型的Property,但以System的Property优先.如果都为Null或内容错误则抛出异常.
     */
    public Double getDouble(String key) {
        String value = getValue(key);
        if (value == null) {
            throw new NoSuchElementException();
        }
        return Double.valueOf(value);
    }

    /**
     * 取出Double类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容错误则抛出异常
     */
    public Double getDouble(String key, Integer defaultValue) {
        String value = getValue(key);
        return value != null ? Double.valueOf(value) : defaultValue;
    }

    /**
     * 取出Boolean类型的Property,但以System的Property优先.如果都为Null抛出异常,如果内容不是true/false则返回false.
     */
    public Boolean getBoolean(String key) {
        String value = getValue(key);
        if (value == null) {
            throw new NoSuchElementException();
        }
        return Boolean.valueOf(value);
    }

    /**
     * 取出Boolean类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容不为true/false则返回false.
     */
    public Boolean getBoolean(String key, boolean defaultValue) {
        String value = getValue(key);
        return value != null ? Boolean.valueOf(value) : defaultValue;
    }

    /**
     * 载入多个文件, 文件路径使用Spring Resource格式.
     */
    private Properties loadProperties(String... resourcesPaths) {
        Properties props = new Properties();

        for (String location : resourcesPaths) {

            InputStream is = null;
            try {
                Resource resource = resourceLoader.getResource(location);
                is = resource.getInputStream();
                props.load(is);
            } catch (IOException ex) {
                System.out.println("Could not load properties from path:" + location + ", " + ex.getMessage());
            } finally {
                IOUtils.closeQuietly(is);
            }
        }
        return props;
    }
}

3. TestProfile.java

import com.weeking.share.config.Global;
import org.junit.Test;

public class TestProfile {
    @Test
    public void profile(){
        String username= Global.getConfig("jdbc.username");
        System.out.println(username);
    }
}

4.测试类运行结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

ORA-02019 错误处理

       ORA-02019 错误提示是未找到远程数据库的连接说明,通常发生在本地数据库无法连接到远程数据库。引发该问题的原因很多,比如网络连接,连接方式(...

16510
来自专栏吴伟祥

MySQL 存储引擎 原

使用MEMORY存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使得MEMORY存储引擎非常快。

8310
来自专栏华章科技

大数据比想象的不靠谱:数据驱动背后的谎言与欺骗

起床后我走进卫生间,称了一下自己的体重。这个数据会从中国制造的体重秤上同步到我手机中的 App 里面,并且最终进入苹果的数据库,我的体重数据将永久地存放在云端。

13830
来自专栏乐沙弥的世界

手动删除oracle数据库

在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库。对此,可以借助drop database命令来实现,下面的描述中给出手动删除数据库

19340
来自专栏华章科技

生命的意义是什么? 谷歌机器人的答案:为了永生

据英国每日邮报报道,当英国剧作家道格拉斯•亚当斯(Douglas Adams)写《银河系漫游指南》时,他写道这样一句话:“有关生命、宇宙和万物的终极问题的答案是...

12820
来自专栏华章科技

做到这些,程序员的工作热情提高200%

( 免责声明:我很幸运地生活在一个程序员工作岗位供大于求的地方,所以对我来说在换工作永远不止一个选择。)

10730
来自专栏吴伟祥

mysql 自增id和UUID做主键性能分析,及最优方案

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领...

75920
来自专栏CDA数据分析师

9 大实际用例,让你重新认识区块链

你一定听过区块链,你上网看了几篇文章,看了些视频弄清楚其运行原理。现在你似乎理解了,但你还是很困惑。

11320
来自专栏机器学习算法原理与实践

PrefixSpan算法原理总结

    前面我们讲到频繁项集挖掘的关联算法Apriori和FP Tree。这两个算法都是挖掘频繁项集的。而今天我们要介绍的PrefixSpan算法也是关联算法,...

10110
来自专栏华章科技

你的公司是否真的需要大数据战略?

我们认为,企业应该重视数据统治和数据管理。如果数据是一个企业最重要的资产,然后常规的数据统治项目和数据管理最佳实践是其能够实现的多数投资策略。如果只有其中一种投...

12230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励