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


172

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


7
您可以使用$ {env.XXXXXXXX}来引用它,其中XXXXXXXX是您的变量名。例如,$ {env.PATH}将提供PATH引用。
Seshagiri

2
但是您可能不应该。如果您使构建依赖于环境,则很难复制它们。
斯蒂芬·C

5
@StephenC我不会说“不应该”,但要“非常小心”。有时,CI环境和本地开发环境看起来有所不同,而环境变量是填补空白的一种方式。
安德鲁·怀特

1
对我而言,IntelliJ 2019将${env.XYZ}参考显示为红色。该变量在运行时已正确展开,但在编译时显示为红色。因此,我有一个最初提出的问题。
djangofan

1
是的,它是@MarkHan
djangofan

Answers:


216

查看《Maven属性指南》 ...

正如Seshagiri在评论中指出的,${env.VARIABLE_NAME}将做您想要的。

我会警告一句,并说a pom.xml应该完整地描述您的项目,因此请谨慎使用环境变量。如果您使构建依赖于环境,则很难复制它们


3
而且,它使您的构建依赖于平台和系统。
lhunath 2012年

12
注意:pom中variable_name的所有字符都必须大写,以便与平台无关。因为它仅在Windows OS上以大写形式有效。例如,即使您定义了一个名为m2_home的环境变量,$ {env.M2_HOME}是有效的,$ {env.m2_home}是无效的。
Jeff Liu

我在Windows环境属性中具有此属性(WL_HOME = c:\ apps \ Weblogic12 \ wlserver_12.1),但在pom中,它会返回此值c:\ apps \ Weblogic12 \ wlserver(without_12.1),其他任何想法都可能在Maven进行选择这个从何而来?
Anand Rockzz

刚刚意识到我正在定义一个正确的<wl_home> $ {WL_HOME} </ wl_home>并使用它,并且如果我这样做,它会以某种方式引用而不包含版本。
Anand Rockzz'3

Windows IDE和CLI中运行良好。对于MacOS / Linux / Unix,要想从IDE那里获得支持就有些棘手了,毫无疑问,这对于Terminal来说很好用。
Md Shahed Hossain

29

将环境变量直接传递到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

4
为什么这样更安全?
weberjn

这对我不起作用,命令行上提供的my.variable的新值永远不会覆盖<properties>块中的值。有任何想法吗?
丹尼尔·斯科特

对我来说,更安全或更神秘的b / c属性可以在属性文件中描述。但是,我意识到我的解决方案依赖于Spring框架,这可能就是为什么它不适用于Daniel的原因。
EricGreg

这样做比较安全,因为如果您无法通过命令行/环境更改值,则它仍然是有效的POM,并且可以根据属性中的值进行构建。
foo

20

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

我一直在努力奋斗一个小时,直到我决定尝试使用大写变量,问题得以解决。

OK变量示例:

  • DUMMY_ONE
  • JBOSS_SERVER_PATH

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

我希望这可以帮助某人。


5
UNIX中的环境变量区分大小写,并且传统上使用大写字母名称,因此,当您查看外壳程序中设置的变量时,您可以轻松地区分在本地设置的变量和对子进程可见的变量。Windows中的环境变量似乎不区分大小写,但是我还没有从文档中证实这一点,仅从命令提示符下的一个小实验中就证实了这一点。
合法化

11

我们不能使用

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

它是隐式的,与使用-D使其显式并覆盖默认属性值的传递相反,这对于设置零配置环境(例如dev)可能仍然有用
Technoshaft '18

1
这样行吗?我已经尝试过了,但至少在我的环境中没有,
user26270 '19

3

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

使用${env.foo}${env.FOO}对我不起作用。Maven只是没有找到变量。有效的方法是将变量作为Maven中的命令行参数传入。设置如下:

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

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

<插件>
  ...
  <执行>
    <执行>
    ...
      <执行>
      ...
        <配置>
          <param> $ {foo} </ param> <!-请注意,这不是* not * $ {env.foo}->
        </ configuration>
  1. 在com.google.code.maven-replacer-plugin中,将替换值设为${foo}

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


0

您可以使用<properties>标签定义自定义变量和${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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.