java.lang.UnsupportedClassVersionError 수정
이 튜토리얼은 Java에서 스레드 메인 java.lang.UnsupportedClassVersionError의 예외
오류를 보여줍니다.
java.lang.UnsupportedClassVersionError
의 원인
UnsupportedClassVersionError
는 ClassFormatError
예외의 하위 클래스로, JVM이 클래스 읽기를 시도하고 클래스 파일의 형식이 잘못되었거나 파일을 클래스로 해석할 수 없음을 발견하면 발생합니다. 다음은 UnsupportedClassVersionError
예외의 계층 구조입니다.
Java.Lang.Object
Java.Lang.Throwable
Java.Lang.Error
Java.Lang.LinkageError
Java.Lang.ClassFormatError
Java.Lang.UnsupportedClassVersionError
UnsupportedClassVersionError
예외는 이전에 하위 버전의 Java에서 실행되었고 현재는 최신 버전에서 실행되는 클래스 파일을 감지하는 데만 해당됩니다.
예를 들어 Java 파일이 JDK 12에서 실행되었고 이제 최신 JRE 8에서 실행되었다고 가정합니다. 이 경우 UnsupportedClassVersionError
예외가 발생하거나 Java 버전 1.8을 사용하여 클래스를 컴파일하고 Java 1.7을 사용하여 컴파일하면 같은 오류가 발생합니다.
최신 버전의 Java에서 컴파일한 다음 이전 버전에서 실행하는 클래스에서 예제를 시도해 봅시다. 예를 참조하십시오:
public class Unsupported_Class_Version_Error{
public static void main(String args[]) {
System.out.println("Hello this is Delftstack.com");
}
}
위의 코드는 아래와 같이 UnsupportedClassVersionError
를 발생시킵니다.
Exception in thread "main" java.lang.UnsupportedClassVersionError: Unsupported_Class_Version_Error : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
코드가 Java 1.8에서 컴파일되고 Java 1.7에서 실행되기 때문에 출력에 오류가 표시됩니다. 이것이 스레드 "main" 예외 java.lang.UnsupportedClassVersionError: Unsupported_Class_Version_Error: Unsupported major.minor version 52.0
이 발생하는 이유입니다.
java.lang.UnsupportedClassVersionError
수정
이 오류에는 두 가지 조건이 있으므로 솔루션은 다음 두 조건에 있습니다.
- 최신 JDK 및 JRE로 코드를 실행합니다.
- 런타임 JDK와 일치하도록 이전 버전의 JDK로 코드를 컴파일합니다.
- 한 가지 간단한 해결책은 Java Cross Compilation을 사용하는 것입니다. 프로덕션 환경 JDK가 빌드 환경보다 낮은 경우 크로스 컴파일을 사용하여 더 낮은 버전의 클래스 파일을 생성할 수 있습니다.
다음 명령은 위 코드에 대한 클래스 파일을 만드는 데 사용됩니다.
javac -target 1.7 Unsupported_Class_Version_Error.java
위에서 언급했듯이 솔루션은 컴파일 및 런타임에 동일한 버전으로 애플리케이션을 빌드하거나 적어도 컴파일 타임 버전이 런타임 버전보다 낮습니다.
위의 오류는 Major Minor 버전 문제를 보여줍니다. Major Minor 버전은 JRE의 버전입니다. 예를 들어 JRE 8의 경우 주 버전은 52.0입니다.
Java Class 파일을 컴파일하고 실행하는 동안 Major Minor 버전 문제가 발생하지 않도록 해야 합니다. 클래스와 호환되는 JRE 버전 목록은 다음과 같습니다.
Java SE 17 = 61,
Java SE 16 = 60,
Java SE 15 = 59,
Java SE 14 = 58,
Java SE 13 = 57,
Java SE 12 = 56,
Java SE 11 = 55,
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
LinkedIn Facebook