그리고 [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을 사용한다.