Search
Duplicate

컴파일된 class 파일의 버전을 확인하는 방법

패치 작업을 하다가 java.lang.UnsupportedClassVersionError 라는 에러를 만난적이 있을 것이다.
보통 Runtime의 Java의 버전보다 class의 컴파일 버전이 더 높은 경우가 대다수이다. (runtime jdk version < class compile version)
운영환경의 Java 버전을 파악하지 않은 채, 소스를 컴파일해서 갔거나,
로컬 개발환경에 컴파일 레벨 설정을 운영환경과 다르게 설정하였을 확률이 높다.
이에 따라 어이 없이 원복을 하고 다시 작업 일정을 잡아야 하는 상황이 발생한다.
이러한 민망한 상황? (경우에 따라, 민망한 수준이 아니라 살벌한 상황이 될 수 도...)을
만나기 전에 항상 컴파일 된 소스 파일을 확인을 하자.
class 파일의 compile level 확인 하는 3가지를 소개하겠다.

IDE 설정에서 class level 확인 하기

Eclipse
IntelliJ

Hex View를 지원하는 에디터로 확인 하기

에디트 플러스, 노트패드++ 등... 여기에 소개하지 않았지만, 유명한 코드 에디터들은 지원 한다..
VSCode의 Hex Editor 익스텐션
Vim
[root@parkjw 1]# vi Sample.class :%!xxd <-- "ESC" 키를 눌러 중립 모드로 변경 후, ":" 키를 입력하여 명령어 입력 :q! <-- 버전 확인 후, 파일을 저장하지 말고 에디터를 닫는다.
Bash
복사
여기서 보이는 숫자는 16진수이며, 이 값(34)을 10진수 로 변환 하면 52가 나온다.
52는 jdk 1.8에 해당한다.
[JDK별 Java Class Version List] JDK 1.8 => 52.0 (34H) JDK 1.7 => 51.0 (33H) JDK 1.6 => 50.0 (32H) JDK 1.5 => 49.0 (31H) JDK 1.4 => 48.0 (30H) JDK 1.3 => 47.0 (2fH)
Bash
복사
회사에서 주로 사용하는 JDK의 버전에 해당하는 값을 외우고 다니면 요긴하게 사용할 수 있다.
바로 컴파일을 다시 할 수 있는 상황이 아니라면 미련을 버린 후,
다음을 기약하며 빠르게 원복 후 퇴근을 하면된다..!

bash shell에서 file 명령어로 확인 하기

[root@parkjw 1]# ls -l total 8 -rw-r--r-- 1 root root 418 Aug 13 23:13 Sample.class -rw-r--r-- 1 root root 125 Aug 13 23:13 Sample.java [root@parkjw 1]# file Sample.class Sample.class: compiled Java class data, version 52.0 (Java 1.8)
Bash
복사
패치 작업 시, 단순히 잘못된 버전으로 컴파일을 하여 원복하는 상황은
예외처리를 하지 않아 NPE가 발생되는 상황과 같이 개발자로써 굉장히 민망한 실수이다.
약간의 시간을 투자하여, 꼼꼼하게 준비를 하는 것이 빠른 퇴근의 지름길이라고 생각한다.