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

6
如何在属性文件中读取系统环境变量。我正在使用MyBatis Maven插件进行数据库迁移。MyBatis基于环境使用属性文件。我正在尝试在属性文件中读取环境变量,例如: development.properties
username=${env.username}
password=${env.password}

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

我将用户名和密码存储在Mac上的“.profile”文件中。读取这些变量的正确方法是什么?


https://dev59.com/Smkv5IYBdhLWcg3wpCMz - OldProgrammer
它没有起作用。Maven没有替换那些变量。如果我指定${var},它会将"${var}"作为值而不是替换var。 - lch
处理Maven中的用户名和密码的最佳方法是加密它。但是,MyBatis Migrations Maven插件不支持使用serverid机制来使用用户名和密码。因此,在此时,您在本地环境中保留用户名和密码的解决方案是有意义的,并且您可以在属性文件中使用这些内容与Maven资源过滤器一起使用。@Christian的解决方案应该适用于您! - Rishikesh Darandale
3个回答

15

你应该先使用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

抱歉,但 project.build.resourceDirectory 要么是循环的,要么无法解析。请参见 https://dev59.com/Y2ox5IYBdhLWcg3wbDsk - Christian
你可能知道,Christian,仅包含外部链接的答案在SO上并不受欢迎。因为我现在没有事情做,所以我做了我通常会要求你做的事情:我将要点内容粘贴到你的答案中,以避免你因为一个本来有帮助的答案而被踩。请记得下次自己完成这个步骤。谢谢。 - kriegaex
@kriegaex 谢谢您 - Christian
1
在使用Spring Boot时,请使用@作为分隔符。$无法使用。 - rustyx

2
那似乎在 mybatis/migrations 问题114 中有讨论:

迁移或迁移-maven-plugin本身不提供过滤(即变量替换)。
但是Maven的资源插件提供了。请参见 Maven Filtering

您可以使用过滤器以及env / system / even settings.xml值,同时使用 pom.xml属性


-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();
      }

2
这并没有回答问题的主题,它是关于Maven而不是Java。 - kriegaex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接