자바(SE)

[JAVA] JRE 버전 문제 정리

은서파 2023. 2. 19. 12:15

여러 버전의 JDK를 설치한 경우 컴파일 환경과 실행 환경의 JRE 버전이 일치하지 않으면 오류가 발생할 수 있다. 이번 포스트에서는 관련 오류를 정리해보자.

 

현재 환경

 

OS(Mac 기준)

현재 필자의 OS에는 JDK11과 JDK 17이 설치되어있다. 

Matching Java Virtual Machines (2):
    17.0.3 (arm64) "Azul Systems, Inc." - "Zulu 17.34.19" /Library/Java/.../Home
    11.0.17 (arm64) "Azul Systems, Inc." - "Zulu 11.60.19" /Library/Java/../Home

그리고 기본 설정으로는 JDK11이 적용되어있다.(JAVA_HOME 설정)

❯ java -version
openjdk version "11.0.17" 2022-10-18 LTS
OpenJDK Runtime Environment Zulu11.60+19-CA (build 11.0.17+8-LTS)
OpenJDK 64-Bit Server VM Zulu11.60+19-CA (build 11.0.17+8-LTS, mixed mode)

이것의 의미는 OS에서 그냥 Java를 사용할 때는 JDK11을 사용하며 특별히 JDK17을 사용하려면 이를 지정하고 사용해야 한다. 

❯ export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home

❯ java -version
openjdk version "17.0.3" 2022-04-19 LTS
OpenJDK Runtime Environment Zulu17.34+19-CA (build 17.0.3+7-LTS)
OpenJDK 64-Bit Server VM Zulu17.34+19-CA (build 17.0.3+7-LTS, mixed mode, sharing)

참고로 위 설정은 현재의 세션에 적용하는 것이고 OS에 설정하기 위해서는 zshrc등 파일에 설정을 추가해야 한다.

https://goodteacher.tistory.com/602

 

[mac]jdk version 설정

이번 포스트에서는 mac에 설치된 jdk의 버전 확인 및 JAVA_HOME 설정 방법에 대해 알아보자. 설치된 JDK 확인 현재 설치된 JDK 를 확인하기 위해서는 /usr/libexec/java_home -V 명령을 사용한다. ❯ /usr/libexec/j

goodteacher.tistory.com

 

개발툴(Eclipse 기준)

현재 설치된 JDK는 두 종류이기는 한데 역시 JDK17 버전이 기본 사용으로 되어있다.

그리고 [Java]-[Compiler]의 Compiler compliance level(컴파일러가 사용하는 버전)을 살펴보면 17버전으로 설정되어있다.

 

이제 환경에 대한 소개를 마쳤으니 프로젝트에서 다양한 컴파일러 버전을 사용하면서 발생하는 오류들에 대해 알아보자.

 

프로젝트 JRE 버전 17

먼저 프로젝트의 JRE 버전을 17로 설정해보자.

 

실행해 보기

먼저 eclipse 자체에서 실행 했을 때는 당연히 아무런 문제가 없다. 

하지만 OS에서 실행하면(jar로 배포한 상태 또는 콘솔 기반으로 실행했을 때)는 오류가 발생한다.

❯ java version.Test
오류: 기본 클래스 version.Test을(를) 로드하는 중 LinkageError가 발생했습니다.
	java.lang.UnsupportedClassVersionError: version/Test has been compiled by a more 
    recent version of the Java Runtime (class file version 61.0), 
    this version of the Java Runtime only recognizes class file versions up to 55.0

컴파일된 class의 버전은 61인데 실제 런타임에서 알아먹을 수 있는 버전은 겨우 55이므로 실행할 수 없단다. ㅜㅜ

참고로 JDK 버전에 따른 클래스 파일(bytecode)의 버전은 아래와 같다.

JDK 17로 작성된 application을 고객사에 배포하는데 고객사가 17이 없다면 다 업그레이드를 해야 한다는 이야기다. 語不成說!

사실 JDK17은 현재 시점(2023.02)에서는 상당히 높은 버전이다. 아직 JDK 8을 사용하는 경우도 비일비재 하다. 

JDK 버전 낮춰보기 - maven 미적용

 

가장 쉬운 해결 방안은? - 전역 설정 변경

가장 쉬운 해결 방안은 애초에 eclipse에서 JDK의 버전을 11로 개발하는 것이다.

default jdk를 11로 변경하면 compiler compliance level이 맞지 않기 때문에 warning이 발생한다. 역시 수정해주자.

 

이제 OS(console client), eclipse의 compiler  모두가 11을 사용하기 때문에 콘솔에서도 잘 실행된다.

❯ java version.Test
Hello Java

하지만 위 설정은 eclipse의 전역 설정을 변경한 것이기 때문에 모든 프로젝트들이 다시 JDK 11로 컴파일 된다. 만약 JDK17기반으로 동작해야하는 녀석이 있다면 낭패다.

 

특정 프로젝트만 JDK 다르게 설정하기

먼저 다시 전역의 JDK 버전을 17로 변경해보자.

그리고 prject의 java build path에서 사용하려는 JDK의 버전을 11로 변경한다.

이제 해당 프로젝트만 JDK11을 이용하게 되었고 console에서의 실행도 문제 없어졌다.

 

JDK 버전 낮춰보기 - maven 적용

만약 Maven을 사용중이라면 java build path에 설정하기 보다는 pom.xml 파일을 이용해서 사용하려는 JDK의 버전을 지정한다.

maven-compiler-plugin

maven에서 compiler의 버전을 지정하기 위해서는 maven-compiler-plugin을 사용한다.

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <release>11</release>
    </configuration>
</plugin>

위의 release 태그는 JDK 9 버전부터 지원되는 속성이다. 만약 이보다 더 낮은 버전의 JDK를 사용중이라면 <source>와 <target>이용한다.

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <!--release>11</release-->
        <source>11</source>
        <target>11</target>
    </configuration>
</plugin>