메이븐 빌드할 때 JAVA_HOME 환경변수를 설정하는 이유가 뭔가요?

2015-03-18 17:59

NEXT 한 학생이 질문이다.

지금까지 eclipse에서 메이븐 기반으로 프로젝트를 빌드할 때는 별다른 설정이 필요없었다. 그런데 터미널에서 mvn 명령으로 프로젝트를 빌드하려고 하니 jdk를 찾지 못해 컴파일 에러가 발생하는 상황이 발생했다.

이 문제는 JAVA_HOME 환경변수를 설정함으로써 해결했다.

여기서 질문..

지금까지 JAVA_HOME 환경변수 설정 안해도 "java -version"같은 명령은 잘 실행되었었는데 왜 mvn 명령어를 실행할 때 JAVA_HOME 환경변수 설정을 해줘야 하는거죠?

메이븐이 JAVA_HOME 환경변수를 필요로 하는 이유는 뭐라고 생각하시나요?

0개의 의견 from FB

7개의 의견 from SLiPP

2015-03-18 18:06

그냥 java -version 같은 명령어를 실행할때는 path 환경변수를 참조하지만, 메이븐은 패스를 참조하지 않기 때문이 아닐까요? 게다가 패스같은 경우에는 여러가지 프로그램을 설치하고 삭제하는 과정에서 몹시 길어지기 때문에 한번 파싱(?)해 줘야 하기도 하고, JDK가 설치된 경로가 2개 이상 지정되어 있을 가능성도 있겠죠. 하지만 JAVA_HOME에는 일반적으로 JDK가 설치된 경로를 하나밖에 등록하지 않으니까(사실 두개 이상 등록 가능한지는 잘 모르겠네요-_-) 어떤 버전의 JDK를 사용할지 명시적으로 지정할 수 있기 때문이 아닐까 합니다.

2015-03-18 18:14

java 는 JRE(Java Runtime Environment)에 포함되어 있기 때문에 실행 경로만 설정되어 있으면 실행할 수 있습니다.

메이븐은 JDK(Java Development Kit)가 필요합니다.

 21 # ------------------------------------------------------------------------->
 22 # Maven2 Start Up Batch script
 23 #
 24 # Required ENV vars:
 25 # ------------------
 26 #   JAVA_HOME - location of a JDK home dir

javac 등 개발도구들을 쓰기 때문에 JRE가 아닌 JDK를 요구하겠죠.

음.. 그런데 이클립스에서 메이븐 쓸 때도 JDK 있어야할텐데... 이클립스도 JDK를 쓰도록 어디선가 설정을 했으니 이클립스에서는 메이븐이 그냥 되는건가??

2015-03-18 18:24

윗 분 말씀처럼 jre, jdk 차이의 문제인듯 합니다. 그 학생은 이클립스도 실행을 못했을 것 같은데, 아마 이클립스 실행은 ini 파일에서 직접 vm path를 잡아준게 아닐까 싶네요.

2015-03-18 21:32

@eungju.park.1 @kimmunsu 이클립스는 기본적으로 JRE만 있어도 실행할 수 있고, 이클립스 내에서 JRE와 별개로 JDK 경로를 설정하면 메이븐 실행이 가능할거다.

그런데 터미널에서 메이븐을 실행할 때는 JAVA_HOME을 설정하지 않아 문제가 발생했다. JAVA_HOME 환경 변수를 추가해 해결했는지 여기서 한 가지 의문은 분명 PATH를 통해 java, javac 모두 실행 가능한데 굳이 메이븐은 JAVA_HOME 설정을 요구하는 상황.

기본적으로 메이븐이 JDK를 요구하고 PATH에 javac도 있기 때문에 JAVA_HOME이 없어도 된다고 생각한거지. 나는 다음과 같이 답변했다.

메이븐은 한 서버에서 여러 개의 프로젝트를 빌드할 수 있는데 각 프로젝트마다 빌드하는 JDK 버전이 다를 수 있다. 이 경우 기본적으로 OS에 JAVA_HOME을 설정해 놓고, 혹시라도 기본 JDK가 아닌 다른 버전의 JDK를 사용해 빌드가 필요한 경우 빌드하는 시점에 JAVA_HOME을 재설정하면 된다라고 설명했다. 이 설명이 적합할까?

2015-03-18 21:50

@자바지기 아;; 제가 오해했나보네요. 몇개월전에 안드로이드 한다고 이클립스 다뤘었는데 그때 jre path를 잡고 있는 바람에 뭐가 실행이 안되서 잠시 삽질해서 저렇게 댓글을 달았는데, 안드로이드 개발툴이 실행이 안되었던 것을 이클립스 실행이 안되서 vm path 잡은 것과 헷갈렸던듯 합니다. ㅎㅎ 말씀하신 설명은... 메이븐 책을 다시 정독하도록 하겠습니다 ..... ㅠ

2015-03-19 01:59

이클립스는 없다고 생각하고.. 지금은 메이븐을 단지 개인의 라이브러리 관리 정도로 사용하지만 빌드도구를 사용하는 궁극적인 목표는 배포파이프라인을 Maven과 같은 빌드도구를 통해서 갖추는 것이고, 자동으로 되는 상황인 경우에도 좀 더 구체적으로 설정하면 문제를 보다 빠르고 정확하게 인식할 수 있습니다.

JAVA_HOME과 유사하게 Maven의 Compiler plugin을 설정하지 않아도 Maven의 Compile Phase가 가능한데 그럴 경우에는 이클립스와 같은 도구에서 사용 시에 update하면 1.5로 바뀝니다.

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

하지만 굳이 이렇게 설정하면 제가 지정한 버전으로만 실행되게 할 수 있고 properties로 버전을 빼면 말씀하신대로 다른 버전의 JDK가 필요한 경우에 재설정

내 pc, 내 IDE안에서 잘 돌아가게 하는 게 아니라 내가 사용하는 빌드도구가 작동가능한 환경이라면 소스도 신뢰할 수 있는 수준에서 사용가능하도록 운용하게끔 굳이 메이븐을 쓰라고 형 책에서 배운 것 같네요

이전 질문과 아울러서 Maven에서 Architype을 만들어서 프로젝트를 복사가 아니라 Architype을 인스톨한 후에 Eclipse에서 Maven 플러그인을 통해서 Import하는 실습을 하면 상호간에 조큼 재밌겠네요. Maven도 프로젝트관리도구로서 조금 더 상세하게 익힐 수 있고

nexus가 없더라도

Github에 아키타입을 만들어서 클론한 뒤에 하면 좋을 거 같습니다.

스트레스 받는 설정부분도 친구들이 같이 사용할 수 있고 서로 소스상에서 개선해나갈 수 있다면 재미겠네요.

2015-03-19 09:11

@자바지기 JRE에는 없는 tools.jar 등도 필요하기 때문이지 않을까요?

JDK 버전을 다른게 쓰기 위해서 JAVA_HOME을 지정한다면 필수 환경 변수가 아니고 M2_HOME이나 MAVEN_OPTS 같이 선택 환경 변수로 명시했을 것 같아요.

의견 추가하기

연관태그

← 목록으로