POM.xml에서 환경 변수를 참조하는 방법은 무엇입니까?


172

maven을 빌드 도구로 사용하고 있습니다. 라는 환경 변수를 설정했습니다 env. pom.xml파일 에서이 환경 변수의 값에 액세스하려면 어떻게 해야합니까?


7
$ {env.XXXXXXXX}로 참조 할 수 있습니다. 여기서 XXXXXXXX는 변수 이름입니다. 예를 들어 $ {env.PATH}는 PATH 참조를 제공합니다.
세 샤기 리

2
그러나 당신은 아마해서는 안됩니다. 빌드를 환경에 따라 만들면 재현하기가 더 어렵습니다.
Stephen C

5
@StephenC 나는 "하지 말아야한다"고 말하지 않고 "조심해야한다"고 말할 것입니다. 때때로 CI 환경과 로컬 개발 환경이 다르게 보이고 환경 변수가 차이를 메우는 방법입니다.
앤드류 화이트

1
나를 위해 IntelliJ 2019는 ${env.XYZ}참조를 빨간색으로 표시합니다 . 변수는 런타임에 올바르게 확장되지만 컴파일시 빨간색으로 표시됩니다. 그러므로 원래 질문했던 것과 같은 질문이 있습니다.
djangofan

1
네, 그것은 @MarkHan 않습니다
djangofan

답변:


216

Maven 속성 가이드를 확인하십시오 ...

의견에서 세 샤기 리가 지적했듯이 ${env.VARIABLE_NAME}원하는 것을 할 것입니다.

경고 단어를 추가하고 pom.xml프로젝트를 완전히 설명해야 한다고 말하면서 환경 변수를 신중하게 사용하십시오. 빌드를 환경에 의존하게 만들면 재현하기가 더 어렵습니다.


3
또한 빌드 플랫폼 및 시스템에 따라 다릅니다.
lhunath

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

IDE 및 CLI의 Windows 에서 제대로 작동합니다 . 들어 맥 OS / 리눅스 / 유닉스 가에 대한 의심의 여지 곳 IDE의 지원을 얻기를위한 약간 까다로운 터미널 , 그것은 잘 작동합니다.
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> 블록의 값을 무시하지 않습니다. 어떤 아이디어?
Daniel Scott

나에게 더 안전하거나 최소한의 신비한 b / c 속성은 속성 파일에서 설명 할 수 있습니다. 그러나 내 솔루션이 Spring 프레임 워크에 의존한다는 것을 알고 있으므로 Daniel에서는 작동하지 않을 수 있습니다.
EricGreg

커맨드 라인 / 환경을 통해 값을 변경하지 못하면 속성의 값에서 여전히 유효한 POM 및 빌드이기 때문에 더 안전합니다.
foo

20

또한 환경 변수대문자로만 구성되어 있는지 확인하십시오 .... 이유는 모르겠습니다 (문서에 대해서는 @Andrew White가 제공 한 링크는 명시 적으로 말하지 않습니다). 변수는 소문자 단어 (예 : env.dummy)이며 변수는 항상 비어 있거나 null입니다 ...

나는 대문자와 같은 변수를 시도하기로 결정하고 문제가 해결 될 때까지 한 시간처럼 이것으로 어려움을 겪고있었습니다.

OK 변수 예 :

  • 가짜의
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( 참고 : maven v3.0.5를 사용하고있었습니다)

나는 이것이 누군가를 도울 수 있기를 바랍니다 ....


5
유닉스의 환경 변수는 대소 문자를 구분하며 일반적으로 대문자로 제공되므로 쉘에서 설정된 변수를 볼 때 쉘에 로컬로 설정된 변수와 하위 프로세스에 표시되는 변수를 쉽게 구별 할 수 있습니다. Windows의 환경 변수는 대소 문자를 구분하지 않지만 문서에서 명령 프롬프트의 작은 실험에서만 확인했습니다.
합법화

11

우리는 사용할 수 없습니다

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

명시 적으로 만들고 기본 속성 값을 재정의하는 -D로 전달할 때와 달리 암시 적 구성 환경 (예 : dev)을 설정하는 데 여전히 유용 할 수 있습니다
Technoshaft

1
이 작동합니까? 나는 그것을 시도했지만 적어도 내 환경에 있지 않습니다
user26270

3

나는 똑같은 문제로 변수를 설정하는 쉘 스크립트를 실행 한 다음 shared-pom에서 변수를 사용하려고했습니다. com.google.code.maven-replacer-plugin을 사용하여 프로젝트 파일의 환경 변수를 문자열로 바꾸는 것이 목표였습니다.

나를 사용 ${env.foo}하거나 ${env.FOO}작동하지 않았습니다. 메이븐은 변수를 찾지 못했습니다. 작동 한 것은 Maven에서 변수를 명령 줄 매개 변수로 전달하는 것이 었습니다. 설정은 다음과 같습니다.

  1. 쉘 스크립트에서 변수를 설정하십시오. 하위 스크립트에서 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을 호출하는 쉘 스크립트에서 다음을 명령에 추가하십시오. -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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.