티스토리 뷰

반응형


가끔 java.lang.UnsupportedClassVersionError를 만나는 경우가 있다. 이는 실행하는 JVM이 지원하지 못하는 java class version을 로드할려고 할 경우 발생한다.

Java는 버전이 올라가면서 class 파일의 포맷과 그 버전도 올라가기도 한다. 물론 상위 JVM은 이전 버전의 java compiler로 컴파일된 이전 버전의 java class도 구동을 하지만 그 반대는 아니다.
즉 최신의 java class 전의 java class를 예전의 JVM으로 구동할 수 없을 수 있다는 것이다. 이 경우 앞의 에러가 발생한다.

편집기로 Java Class 버전 확인하기
의외로 간단하며 컴파일된 Java class를 울트라에디터 같이 HEX 모드로 볼 수 있는 편집기로 열어본다.
그러면 맨앞에 다음과 같이 시작한다.

00000000h: CA FE BA BE 00 00 00 32 00 67 07 00 02 01 00 27
...


CA FE BA BE 는 Java class라는 Magic Number이고 그 뒤에 java class version이 보인다. 위의 경우는 32인데 이것은 16진수이고 10진수로 계산하면 50 이된다. 즉 이 java class의 version은 50이라는 것이다.
JDK 버전마다 class 버전은 다음과 같다.

  • 48: java 1.4.2
  • 49: java 5
  • 50: java 6

즉 이 클래스는 java 6 로 컴파일 된 클래스이며 java 5나 그 이하의 jvm에서 이 클래스를 사용할 경우 앞의 에러를 만날 수 있다.


javap로 확인하기
JDK에 javap라는 명령어가 있다. java class의 최상위 패키지 디렉토리 아래에서 다음과 예와 같이 입력한다.

prompt> javap -verbose kr.nextree.nexdic.actions.AddTermAction
public class kr.nextree.nexdic.actions.AddTermAction extends org.eclipse.jface.action.Action
  SourceFile: "AddTermAction.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = class        #2;     //  kr/nextree/nexdic/actions/AddTermAction
const #2 = Asciz        kr/nextree/nexdic/actions/AddTermAction;
const #3 = class        #4;     //  org/eclipse/jface/action/Action
...

major version을 보면 class 버전을 확인할 수 있다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함