본문 바로가기

Linux

[linux 에러] JAVA_HOME should point to a JDK not a JRE

보통 Maven 컴파일 시 발생하는 에러입니다.

 

 

 

1. 에러 원인

리눅스에 Maven을 설치한 후에, JAVA_HOME 환경변수를 설정해줘야 Maven이 JDK 위치를 찾아서 실행할 수 있습니다.

Maven의 목표는 우리가 실행하려는 프로젝트의 소스 코드에 맞는 적합한 Java 컴파일러를 실행시키는 것이기 때문입니다. 

 

만약, JAVA_HOME 환경변수를 설정하지 않았거나 제대로 된 JDK 위치를 가리키지 않은 경우, 다음과 같은 에러를 냅니다.

mvn -version
 
# Output... 
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK, not a JRE

 

Maven이 JAVA_HOME을 찾는 원리를 초간단하게 설명하자면..

 

내부적으로(Apache Maven v3.5.4)

$JAVA_HOME/bin/java 을 찾도록 설정되어 있습니다.

그런데 만약, JDK가 아닌 JRE를 가리키도록 설정되어 있어도 초기 단계에서는 에러가 안납니다.

왜냐면 JDK와 JRE 둘 다 bin 폴더와 javac 파일을 가지고 있기 때문입니다.

 

JRE의 메인 기능은 Java code를 실행시키는 것(run)이지만,

JDK는 실행과 컴파일, 디버그(run, compile, debug) 등 여러 다른 중요한 것들을 합니다.

 

하여간 우리는 JAVA_HOME 을 JRE가 아닌, JDK를 가리키도록 해야합니다.

 

 

그래서 내 JAVA_HOME이 JDK를 제대로 가리키고 있는건지 확인하는 방법은?

 

다음 명령어를 쳐서 다음과 같이 버전정보가 나온다면 제대로 가리키고 있는겁니다.

 

이렇게 뜨면, 제대로 가리키고 있지 않다는겁니다.

> bash: /bin/javac: No such file or directory

 

2. 해결 방법 

방법은 2가지가 있습니다.

 

① 해당 서버 환경에서 JAVA_HOME 을 JRE 위치가 아닌 JDK를 가리키도록 변경

이건 검색 좀만 해봐도 나오니.. 생략 (환경변수 설정하는 방법)

 

② Project 소스에서 고쳐주는 방법 (pom.xml)

configuration 태그 안에 아래와 같이 jdk 위치를 명시해주세요! 

물론, executable 태그 안에는 서버에 깔려있는 jdk 위치를 각자 상황에 맞게 가리켜야겠죠 

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <fork>true</fork>
        <executable>/usr/lib/jvm/java-11-openjdk-amd64/bin/javac</executable>
    </configuration>
</plugin>