Como referenciar variável de ambiente no POM.xml?

172

Estou usando o maven como ferramenta de construção. Eu configurei uma variável de ambiente chamada env. Como posso acessar o valor dessa variável de ambiente no pom.xmlarquivo?

user1016403
fonte
7
você pode consultá-lo com $ {env.XXXXXXXX}, onde XXXXXXXX é o nome da sua variável. Por exemplo, $ {env.PATH} fornecerá a referência PATH.
Seshagiri 5/05
2
Mas você provavelmente não deveria. Se você criar suas construções dependentes do seu ambiente, elas serão mais difíceis de reproduzir.
Stephen C
5
@ StephenF Eu não diria "não deveria", mas "tenha muito cuidado". Às vezes, um ambiente de IC e um ambiente de desenvolvimento local parecem diferentes e as variáveis ​​de ambiente são uma maneira de preencher as lacunas.
Andrew White
1
Para mim, o IntelliJ 2019 mostra a ${env.XYZ}referência em vermelho. A variável é expandida corretamente no tempo de execução, mas é mostrada em vermelho no tempo de compilação. Portanto, tenho a mesma pergunta que foi originalmente feita.
djangofan
1
Sim, ele faz @MarkHan
djangofan 5/11/19

Respostas:

216

Confira o Guia de propriedades do Maven ...

Como Seshagiri apontou nos comentários, ${env.VARIABLE_NAME}fará o que quiser.

Vou adicionar uma palavra de aviso e dizer que a pom.xmldeve descrever completamente seu projeto, portanto, use variáveis ​​de ambiente criteriosamente. Se você criar suas construções dependentes do seu ambiente, elas serão mais difíceis de reproduzir

Andrew White
fonte
3
Além disso, torna a sua compilação dependente da plataforma e do sistema.
Lhunath 02/12/12
12
Cuidado: todos os caracteres de variable_name no seu pom devem estar em maiúsculas para serem independentes da plataforma. Porque é válido apenas em maiúsculas em execução no sistema operacional Windows. Por exemplo, $ {env.M2_HOME} é válido, $ {env.m2_home} é inválido, mesmo se você definiu uma variável de ambiente denominada m2_home.
Jeff Liu
Eu tenho isso nas propriedades do ambiente do Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1), mas em pom, ele retorna esse valor c: \ apps \ Weblogic12 \ wlserver (without_12.1) qualquer idéia de onde outro maven possa estar escolhendo isso de?
Anand Rockzz
Acabei de perceber que eu estava definindo um <wl_home> $ {WL_HOME} </wl_home> corretamente e usando isso e, de alguma forma, ele se referia sem a versão, se eu fizer isso.
Anand Rockzz
Está funcionando bem no Windows para IDE e CLI. Para MacOS / Linux / Unix , é um pouco complicado obter suporte do IDE, onde sem dúvida para o Terminal , está funcionando bem.
Md Shahed Hossain
29

Pode ser mais seguro passar diretamente as variáveis ​​de ambiente para as propriedades do sistema. Por exemplo, digamos no Linux que você deseja acessar a variável de ambiente MY_VARIABLE. Você pode usar uma propriedade do sistema no seu arquivo pom.

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

Defina o valor da propriedade na linha de comando maven:

mvn clean package -Dmy.variable=$MY_VARIABLE
EricGreg
fonte
4
por que isso é mais seguro?
Weberjn
Isso não está funcionando para mim, o novo valor de my.variable fornecido na linha de comando nunca substitui o valor no bloco <properties>. Alguma ideia?
Daniel Scott
Para mim, as propriedades b / c mais seguras ou pelo menos menos misteriosas podem ser descritas em um arquivo de propriedades. No entanto, percebo que minha solução depende da estrutura Spring, e é provavelmente por isso que não funciona para Daniel.
EricGreg
é mais seguro porque se você não conseguir alterar o valor via linha de comando / ambiente, ainda será um POM e compilação válidos, a partir do valor nas propriedades.
foo
20

Além disso, verifique se sua variável de ambiente é composta apenas por LETRAS MAIÚSCULAS ... Não sei por que (a documentação não diz nada explícito sobre ela, pelo menos o link fornecido por @Andrew White), mas se a variável é uma palavra minúscula (por exemplo, env.dummy), a variável sempre veio vazia ou nula ...

Eu estava lutando com isso por uma hora, até que decidi tentar uma VARIAÇÃO SUPERIOR DE CASO, e o problema foi resolvido.

Exemplos de variáveis ​​OK:

  • MANEQUIM
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( NOTA : eu estava usando o maven v3.0.5)

Espero que isso possa ajudar alguém ....

Carlitos Way
fonte
5
As variáveis ​​de ambiente no unix fazem distinção entre maiúsculas e minúsculas e, tradicionalmente, recebem nomes em maiúsculas, de modo que, quando você olha para as variáveis ​​definidas no shell, é possível distinguir facilmente quais são definidas localmente para o shell e que são visíveis para os processos filhos. As variáveis ​​de ambiente no Windows não parecem fazer distinção entre maiúsculas e minúsculas, mas não verifiquei isso na documentação, apenas em um pequeno experimento no prompt de comando.
legalize
11

Não podemos usar

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>
tmjee
fonte
Sua implícita, ao contrário de quando você passá-lo com um D que torna mais explícito e substitui o valor da propriedade padrão, que pode ser ainda útil para configurar um ambiente de zero configuração (por exemplo dev)
Technoshaft
1
Isto funciona? Eu tentei isso e não é, pelo menos não no meu ambiente
user26270
3

Eu estava lutando com a mesma coisa, executando um script de shell que definia variáveis ​​e depois queria usá-las no pom-shared. O objetivo era fazer com que as variáveis ​​de ambiente substituíssem as strings nos arquivos do meu projeto usando o com.google.code.maven-replaceer-plugin.

Usando ${env.foo}ou ${env.FOO}não funcionou para mim. Maven simplesmente não estava encontrando a variável. O que funcionou foi passar a variável como um parâmetro de linha de comando no Maven. Aqui está a configuração:

  1. Defina a variável no script de shell. Se você estiver iniciando o Maven em um sub-script, verifique se a variável está sendo definida, por exemplo, usando-o source ./maven_script.shpara chamá-lo a partir do script pai.

  2. No shared-pom, crie um parâmetro da linha de comandos que pegue a variável de ambiente:

<plugin>
  ...
  <execuções>
    <execuções>
    ...
      <execução>
      ...
        <configuração>
          <param> $ {foo} </param> <! - Observe que este não é * não * $ {env.foo} ->
        </configuration>
  1. No com.google.code.maven-replaceer-plugin, faça o valor de substituição ${foo}.

  2. No meu script de shell que chama maven, adicione isso ao comando: -Dfoo=$foo

fjones
fonte
0

Você pode usar a <properties>tag para definir uma variável personalizada e um ${variable}padrão para usá-la

<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>
yoAlex5
fonte