How to Handle “class file has wrong version” Errors in Java

1. 개요

Java 프로젝트를 작업할 때 새로운 프로젝트를 설정하거나 의존성을 업데이트 또는 추가할 때 흔히 발생하는 오류는 “클래스 파일의 버전이 잘못되었습니다”라는 오류입니다.

이 튜토리얼에서는 이 오류가 발생하는 이유를 살펴보고 두 가지 해결 방법을 탐구합니다.

2. 원인

원인에 대해 이해하기 위해 클래스 파일에 대해 좀 더 알아야 합니다.

Java 코드를 컴파일할 때마다 컴파일되는 파일에 포함된 각 클래스에 대해 .class 파일이 생성됩니다. 이러한 .class 파일의 메타데이터 일부는 코드 컴파일에 사용된 Java의 현재 주요 버전 번호와 일치하는 버전 번호입니다.

가장 일반적인 Java 버전의 경우, 클래스 버전 번호는 Java 21에 대해 65.0, Java 17에 대해 61.0, Java 11에 대해 55.0, Java 8에 대해 51.0입니다. 다른 버전의 Java를 사용하는 경우, 필요에 따라 1을 더하거나 빼서 해당 클래스 파일 버전 번호를 파악할 수 있습니다.

런타임 시 Java는 각 .class 파일을 확인하며 런타임 환경의 버전 번호가 .class 파일을 컴파일하는 데 사용된 버전 번호보다 크거나 같아야 합니다. 이 버전 번호 요구 사항은 Java의 하위 호환성 메커니즘 때문입니다. 즉, Java 17을 사용하여 코드를 실행하는 경우 Java 17 또는 이전 버전으로 컴파일된 클래스 파일을 사용할 수 있습니다. 그러나 Java 21로 컴파일된 .class 파일을 만나면 “클래스 파일의 버전 65.0, 61.0이어야 합니다”라는 오류가 발생합니다.

3. 해결책

“클래스 파일의 버전이 잘못되었습니다”라는 오류는 런타임에서 사용되는 Java 버전보다 높은 버전의 Java로 컴파일된 코드를 사용하는 경우에 발생합니다.

3.1. Java 업그레이드

첫 번째 해결책은 런타임 환경을 업그레이드하는 것입니다. 첫 번째 단계는 업그레이드된 Java 버전을 다운로드하고 설치하는 것입니다. Java 설치 및 업그레이드 단계는 Windows, macOS, Ubuntu에 따라 다를 수 있습니다.

예를 들어 “클래스 파일의 버전 61.0 (Java 17), 55.0 (Java 11)이어야 한다”라는 오류가 발생하면, Java 17+ 버전을 설치하고 Java 컴파일러 버전을 관리하는 빌드 속성을 업데이트하여 해결할 수 있습니다. Maven을 사용하는 경우, pom.xml 파일을 간단히 업데이트하면 됩니다:

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

3.2. 의존성 다운그레이드

경우에 따라 Java 환경을 업그레이드할 수 없는 경우가 있습니다. 이 경우 어떤 의존성이 오류를 발생시키는지 진단해야 합니다.

Spring 의존성을 예로 들면 현재 주요 릴리스 버전은 Spring Framework 6과 Spring Boot 3입니다. 두 가지 모두 최소 Java 17을 요구하지만 Spring Framework 5와 Spring Boot 2는 Java 8로 컴파일되었습니다.

즉, 이전 버전의 Java를 사용하는 경우 Spring 의존성을 낮춰 실행을 계속할 수 있습니다. 그러나 이러한 이전 버전의 Spring에 대한 오픈 소스 지원은 종료되었다는 점에 유의해야 합니다.

또한, 의존성을 다운그레이드하면 다른 컴파일 또는 런타임 오류가 발생할 수 있습니다. 특히 라이브러리의 최신 기능을 사용하는 경우에는 이전 버전에서 사용할 수 없을 수 있습니다. 특히 Spring Framework 또는 Spring Boot를 다운그레이드하는 것은 상당한 노력이 필요할 수 있습니다.

4. 결론

이제 “클래스 파일의 버전이 잘못되었습니다” 오류를 해결할 수 있는 두 가지 방법이 있습니다.

의존성을 다운그레이드하는 것은 종종 더 빠른 해결책이 될 수 있습니다. 그러나 최근 보안 패치나 지원이 없는 버전을 사용할 수 있는 가능성이 있습니다. 이는 라이브러리가 이전 버전으로 되돌아가면서 발생할 수 있는 컴파일이나 런타임 오류를 초래할 수 있습니다.

반면, Java 빌드와 런타임 환경을 업그레이드하면 최신 의존성을 사용할 수 있지만, 비즈니스 제약으로 인해 이 방법이 불가능할 수 있습니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다