如何在 POM.xml 中引用环境变量?

Posted

技术标签:

【中文标题】如何在 POM.xml 中引用环境变量?【英文标题】:How to refer environment variable in POM.xml? 【发布时间】:2012-05-14 20:08:21 【问题描述】:

我使用 maven 作为构建工具。我设置了一个名为env 的环境变量。如何在 pom.xml 文件中访问此环境变量的值?

【问题讨论】:

您可以使用 $env.XXXXXXXX 引用它,其中 XXXXXXXX 是您的变量名。例如 $env.PATH 将提供 PATH 参考。 但您可能不应该这样做。如果你的构建依赖于你的环境,它们就更难复制了。 @StephenC 我不会说“不应该”,而是“要非常小心”。有时 CI 环境和本地开发环境看起来不同,环境变量是一种填补空白的方法。 对我来说,IntelliJ 2019 将 $env.XYZ 引用显示为红色。该变量在运行时正确展开,但在编译时显示为红色。因此,我有最初提出的相同问题。 是的,@MarkHan 【参考方案1】:

查看Maven Properties Guide...

正如 Seshagiri 在 cmets 中指出的那样,$env.VARIABLE_NAME 会做你想做的事。

我将添加一句警告,并说pom.xml 应该完整地描述您的项目,因此请明智地使用环境变量。如果你的构建依赖于你的环境,它们就更难复制

【讨论】:

另外,它使您的构建平台和系统依赖。 注意:你的 pom 中 variable_name 的所有字符都必须大写才能与平台无关。因为它仅在 Windows 操作系统上运行的大写形式有效。例如,$env.M2_HOME 有效,$env.m2_home 无效,即使您定义了名为 m2_home 的环境变量。 我在 Windows 环境属性 (WL_HOME=c:\apps\Weblogic12\wlserver_12.1) 中有这个,但在 pom 中,它返回这个值 c:\apps\Weblogic12\wlserver(without_12.1)知道 maven 还能从哪里得到这个吗? 刚刚意识到我正在定义一个正确调用的 $WL_HOME 并使用它,如果我这样做,它会以某种方式在没有版本的情况下引用。 环境变量非常有用,在这里推荐它们,例如12factor.net。由于容器和 Kubernetes,这些变量变得越来越重要:您可以简单地在 Kubernetes 中保密,并在启动时将它们添加到您的容器环境中。【参考方案2】:

直接将环境变量传递给 maven 系统属性可能更安全。例如,假设在 Linux 上您要访问环境变量 MY_VARIABLE。您可以在 pom 文件中使用系统属性。

<properties>
    ...
    <!-- Default value for my.variable can be defined here -->
    <my.variable>foo</my.variable>
    ...
</properties>
...
<!-- Use my.variable -->
... $my.variable ...

在maven命令行上设置属性值:

mvn clean package -Dmy.variable=$MY_VARIABLE

【讨论】:

为什么这样更安全? 这对我不起作用,命令行上提供的 my.variable 的新值永远不会覆盖 块中的值。有什么想法吗? 对我来说更安全,或者至少不那么神秘,可以在属性文件中描述 b/c 属性。但是,我意识到我的解决方案依赖于 Spring 框架,这可能是它对 Daniel 不起作用的原因。 它更安全,因为如果您无法通过命令行/环境更改值,它仍然是有效的 POM 并根据属性中的值构建。 so $my.variable 在 pom 中等同于 MY_VARIABLE,在 MacOS/Linux 中导出变量时全部大写和下划线???【参考方案3】:

另外,请确保您的 环境变量 仅由大写字母组成....我不知道为什么(文档没有说什么明确说明,至少@Andrew White 提供的链接),但如果变量是小写单词(例如 env.dummy),则变量总是为空或 null...

我为此苦苦挣扎了一个小时,直到我决定尝试一个大写变量,并且问题解决了。

OK 变量示例:

假人 DUMMY_ONE JBOSS_SERVER_PATH

注意:我使用的是maven v3.0.5)

我希望这可以帮助某人....

【讨论】:

unix 中的环境变量区分大小写,并且传统上使用大写名称,因此当您查看 shell 中设置的变量时,您可以轻松区分哪些是本地设置的,哪些是可见的到子进程。 Windows 中的环境变量似乎不区分大小写,但我没有从文档中验证这一点,只能从命令提示符下的一个小实验中验证。 但在 pom 中,变量全小写并用点 (.) 分隔,但在 mac/Linus 中,使用 _ 下划线分隔符导出其所有大写字母时正确吗? 如果我明白你在问什么......答案是否定的。 pom 中的环境变量名称应与操作系统中声明的名称完全相同。因此,将下划线转换为点是不可以的。【参考方案4】:

我们不能用吗

<properties>
    <my.variable>$env.MY_VARIABLE</my.variable>
</properties>

【讨论】:

它是隐式的,而不是当您使用 -D 传递它时,它使其显式并覆盖默认属性值,这对于设置零配置环境(例如 dev)可能仍然有用跨度> 这行得通吗?我试过了,但不是,至少在我的环境中没有【参考方案5】:

我也在为同样的事情苦苦挣扎,运行一个设置变量的 shell 脚本,然后想在 shared-pom.xml 中使用这些变量。目标是使用 com.google.code.maven-replacer-plugin 让环境变量替换我的项目文件中的字符串。

使用$env.foo$env.FOO 对我不起作用。 Maven 只是没有找到变量。起作用的是在 Maven 中将变量作为命令行参数传递。这是设置:

    在 shell 脚本中设置变量。如果您在子脚本中启动 Maven,请确保已设置变量,例如使用source ./maven_script.sh 从父脚本调用它。

    在 shared-pom 中,创建一个获取环境变量的命令行参数:

... ... ... $foo 配置>

    在 com.google.code.maven-replacer-plugin 中,将替换值设为$foo

    在我调用 maven 的 shell 脚本中,将其添加到命令中:-Dfoo=$foo

【讨论】:

【参考方案6】:

你可以使用&lt;properties&gt;标签来定义一个自定义变量和$variable模式来使用它

<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">

    <!-- define -->
    <properties>
        <property.name>1.0</property.name>
    </properties>

    <!-- using -->
    <version>$property.name</version>

</project>

【讨论】:

如何在 macos 中定义该变量?即property.name?会是 export PROPERTY_NAME='blah' 吗?

以上是关于如何在 POM.xml 中引用环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 maven pom 访问 linux 环境变量?

maven 03-pom.xml核心配置

如何在 maven pom.xml 中更改 shell 脚本输出以使用

在 pom.xml 中对变量进行子字符串化

maven 灵活构建

Makefile中要引用一个系统环境变量该怎么办