Variável de ambiente com Maven

86

Transferi um projeto do Eclipse para o Maven e preciso definir uma variável de ambiente para fazer meu projeto funcionar.

No Eclipse, vou para "Executar -> Executar configurações" e, na guia "ambiente", defino "WSNSHELL_HOME" com o valor "conf".

Como posso fazer isso com o Maven?

Muito obrigado!

Gianluca
fonte
Eu sugeriria começar seu projeto sem variável de ambiente. E então vá para o maven.
khmarbaise de
3
Não há razão para ignorar o uso de variáveis ​​de ambiente se for útil para o seu sistema e tenho certeza de que minha solução funciona (eu mesmo uso). Veja minha dica referente a 'System.getenv' / 'System.getProperty'.
FrVaBe

Respostas:

120

Você pode simplesmente passá-lo na linha de comando, como

mvn -DmyVariable=someValue install

[Atualizar] Observe que a ordem dos parâmetros é significativa - você precisa especificar qualquer opção antes do (s) comando (s). [/Atualizar]

No arquivo POM, você pode se referir às variáveis ​​do sistema (especificadas na linha de comando ou no pom) como ${myVariable}e às variáveis ​​de ambiente como ${env.myVariable}. (Obrigado aos comentaristas pela correção.)

Update2

OK, então você deseja passar sua variável de sistema para seus testes. Se - como eu suponho - você usar o plug-in Surefire para teste, o melhor é especificar as variáveis ​​de sistema necessárias dentro do pom, em sua pluginsseção, por exemplo

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            ...
            <configuration>
                ...
                <systemPropertyVariables>
                    <WSNSHELL_HOME>conf</WSNSHELL_HOME>
                </systemPropertyVariables>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>
Péter Török
fonte
Preciso iniciar o 'teste de mvn', parece não funcionar, porque se eu escrever teste de mvn -DWSNSHELL_HOME = conf ainda recebo a exceção java.io.FileNotFoundException: null / wsnshell.conf (Não existe esse arquivo ou diretório)
Gianluca,
2
@Janky, tente ao contrário, ou seja mvn -DWSNSHELL_HOME=conf test.
Péter Török,
não ... :( Ainda recebo java.io.FileNotFoundException: null / wsnshell.conf (Não existe esse arquivo ou diretório) ... no código, li a variável desta forma .. System.getenv("WSNSHELL_HOME");está correto?
Gianluca
@Janky, espere um minuto, você executa o aplicativo diretamente da compilação do Maven ou ...?
Péter Török,
43
Vocês dois estão confundindo Variáveis ​​de ambiente com Propriedades do sistema. A opção de comando -D define apenas as Propriedades do sistema.
Wouter Lievens
25

As -Dpropriedades não serão propagadas de forma confiável do plug-in infalível para o seu teste (não sei por que funciona com o eclipse). Ao usar maven na linha de comando, use a propriedade argLine para envolver sua propriedade. Isso os passará para o seu teste

mvn -DargLine="-DWSNSHELL_HOME=conf" test

Use System.getPropertypara ler o valor em seu código. Dê uma olhada neste post sobre a diferença de System.getenve Sytem.getProperty.

FrVaBe
fonte
2
Você deve ler a propriedade com System.getProperty ("WSNSHELL_HOME") em vez de usar System.getenv.
FrVaBe
Perfeito, depois de passar MUITO tempo tentando outras coisas, essa funcionou para mim.
Bhushan
Se você configurou parâmetros argLine para o plug-in infalível em seu pom.xml, adicione o ${argLine}marcador, caso contrário, os parâmetros da linha de comando não serão selecionados. Exemplo:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson
Isso funcionou para mim, obrigado! Que ferramenta bacana para configurar sys-props para testes de maven. Ainda à primeira vista, é muito confuso, porque não pode usá-los diretamente, mas requer um argumento extra.
phi
9

Você pode envolver seu comando maven em um script bash:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR
modle13
fonte
Inacreditavelmente, este é o único método que funcionou completamente para mim usando o plugin Surefire. Dos 10 ou mais env vars que configurei no POM, dois deles não são vistos quando o teste é executado. Mesmo se eu defini-los no shell e então mvn install, eles ainda estão de alguma forma obscurecidos. No entanto, se eu executar a partir de um script de shell, ele funcionará bem! Eu gostaria de entender por que isso acontece.
Pete
Acredito que essa seja uma resposta aceita, pois é a solução mais simples
wtsiamruk
5

Para a variável de ambiente no Maven, você pode definir abaixo.

http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#environmentVariables http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html #variáveis ​​ambientais

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <includes>
            ...
        </includes>
        <environmentVariables>
            <WSNSHELL_HOME>conf</WSNSHELL_HOME>
        </environmentVariables>
    </configuration>
</plugin>
Kevin
fonte
4

Existe um plugin maven chamado properties-maven-plugin, este fornece um objetivo set-system-propertiespara definir variáveis ​​de sistema. Isso é especialmente útil se você tiver um arquivo contendo todas essas propriedades. Assim, você pode ler um arquivo de propriedades e defini-los como variáveis ​​de sistema.

cristão
fonte
3

Outra solução seria definir MAVEN_OPTS(ou outras variáveis ​​de ambiente) no ${user.home}/.mavenrc(ou %HOME%\mavenrc_pre.batno Windows).

Desde o Maven 3.3.1, existem novas possibilidades para definir parâmetros de linha de comando mvn , se isso é o que você realmente deseja:

  • ${maven.projectBasedir}/.mvn/maven.config
  • ${maven.projectBasedir}/.mvn/jvm.config
René
fonte
1

no seu código, adicione:

System.getProperty("WSNSHELL_HOME")

Modifique ou adicione propriedade de valor a partir do comando maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

Se você deseja executá-lo no Eclipse, adicione argumentos VM em suas configurações de Depurar / Executar

  • Vá para Executar -> Configurações de execução
  • Selecione os argumentos da guia
  • Adicionar na seção VM Argumentos

-DWSNSHELL_HOME = seu valor

Veja um exemplo de imagem

você não precisa modificar o POM

Luis Eduardo Blandon Puello
fonte
0

Seguindo a documentação da resposta de @Kevin, a seguinte funcionou para mim para definir a variável de ambiente com o plugin maven sure-fire

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
    <environmentVariables>
        <WSNSHELL_HOME>conf</WSNSHELL_HOME>
    </environmentVariables>
</configuration>
Yuvaraj G
fonte
0

Você pode passar alguns dos argumentos por meio da _JAVA_OPTIONSvariável.

Por exemplo, defina uma variável para sinalizadores de proxy maven como este:

_JAVA_OPTIONS="-Dhttp.proxyHost=$http_proxy_host -Dhttp.proxyPort=$http_proxy_port -Dhttps.proxyHost=$https_proxy_host -Dhttps.proxyPort=$http_proxy_port"

E então use mvn clean install(ele pegará automaticamente _JAVA_OPTIONS).

Davis Benny
fonte