Maven在属性文件中读取环境变量

时间:2018-02-08 19:34:33

标签: java maven mybatis

如何读取属性文件中的系统环境变量。我正在使用MyBatis maven插件进行数据库迁移。 MyBatis使用基于环境的属性文件。我试图在属性文件中读取环境变量,如:

development.properties

username=${env.username}
password=${env.password}

Error: FATAL: role "${env.username}" does not exist

我将用户名和密码存储在" .profile"在mac上的文件。阅读这些变量的正确方法是什么?

3 个答案:

答案 0 :(得分:8)

您应该首先使用maven资源插件过滤属性文件。之后myBatis插件应该按预期工作。

有关资源插件的简短示例,请参阅以下gist

<强> development.properties

# place in src/main/resources
username=${env.username}
password=${env.password}

<强>的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.stackoverflow</groupId>
    <artifactId>question-48693420</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

命令行:

username=user1 password=pass1 mvn resources:resources && cat target/classes/development.properties

控制台日志:

(...)
[INFO] --- maven-resources-plugin:2.3:resources (default-cli) @ question-48693420 ---
(...)
[INFO] Copying 1 resource
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
(...)

username=user1
password=pass1

答案 1 :(得分:2)

这似乎是在mybatis/migrations issue 114中讨论的:

  

迁移或迁移-maven-plugin本身不提供过滤(即变量替换)   但Maven的资源插件确实如此。请参阅Maven Filtering

     

您可以使用pom.xml properties将过滤与env / system / even settings.xml值一起使用。

答案 2 :(得分:1)

如果要在类中获取并加载属性值。您可以使用以下代码:

String userName = DatabasePropertyHandler.resolveEnvVars(${env.username});

public static String resolveEnvVars(String input)
      {
          if (null == input)
          {
              return null;
          }
          // match ${ENV_VAR_NAME} or $ENV_VAR_NAME
          Pattern p = Pattern.compile("\\$\\{(\\w+)\\}|\\$(\\w+)");
          Matcher m = p.matcher(input); // get a matcher object
          StringBuffer sb = new StringBuffer();
          while(m.find()){
              String envVarName = null == m.group(1) ? m.group(2) : m.group(1);
              String envVarValue = System.getenv(envVarName);
              m.appendReplacement(sb, null == envVarValue ? "" : envVarValue);
          }
          m.appendTail(sb);
          return sb.toString();
      }