1. 개요

이 사용방법(예제)에서는 .class 파일 의 Java 릴리스 버전을 찾는 방법을 살펴보겠습니다 . 또한 jar 파일에서 Java 버전을 확인하는 방법을 살펴보겠습니다.

2. Java의 .class 버전

Java 파일이 컴파일되면 .class 파일이 생성됩니다. 경우에 따라 컴파일된 클래스 파일의 Java 릴리스 버전을 찾아야 합니다. 각 Java 주요 릴리스는 생성하는 .class 파일 의 주요 버전을 지정합니다 .

이 표에서 .class 의 주 버전 번호 를 해당 클래스 버전이 도입된 JDK 버전에 매핑하고 해당 버전 번호 의 16진수 표현을 보여줍니다.

자바 릴리스 클래스 메이저 버전 마녀
자바 SE 18 62 003e
자바 SE 17 61 003d
자바 SE 16 60 003c
자바 SE 15 59 003b
자바 SE 14 58 003a
자바 SE 13 57 0039
자바 SE 12 56 0038
자바 SE 11 55 0037
자바 SE 10 54 0036
자바 SE 9 53 0035
자바 SE 8 52 0034
자바 SE 7 51 0033
자바 SE 6 50 0032
자바 SE 5 49 0031
JDK 1.4 48 0030
JDK 1.3 47 002f
JDK 1.2 46 002e
JDK 1.1 45 002d

3. .class 버전 용 javap 명령

간단한 클래스를 만들고 JDK 8로 빌드해 보겠습니다.

public class Sample {
    public static void main(String[] args) {
        System.out.println("Baeldung tutorials");
    }
}

클래스 파일의 버전을 식별하기 위해 Java 클래스 파일 디스어셈블러 javap 를 사용할 수 있습니다 .

다음은 javap 명령 의 구문입니다 .

javap [option] [classname]

예를 들어 Sample.class 의 버전을 확인해 보겠습니다 .

javap -verbose Sample

//stripped output ..
..
..
Compiled from "Sample.java"
public class test.Sample
  minor version: 0
  major version: 52
..
..

javap 명령 의 출력에서 ​​볼 수 있듯이 주 버전은 JDK8용임을 나타내는 52입니다.

javap 는 많은 세부 정보를 제공 하지만 우리는 주 버전에만 관심이 있습니다.

Linux 기반 시스템의 경우 다음 명령을 사용하여 주 버전만 얻을 수 있습니다.

javap -verbose Sample | grep major

마찬가지로 Windows 시스템의 경우 사용할 수 있는 명령은 다음과 같습니다.

javap -verbose Sample | findstr major

이 예제에서는 주 버전인 52를 제공합니다.

이 버전 값은 애플리케이션이 해당 JDK로 빌드되었음을 나타내지 않는다는 점에 유의해야 합니다. 클래스 파일 버전은 컴파일에 사용되는 JDK와 다를 수 있습니다.

예를 들어 JDK11로 코드를 빌드하면 버전 55의 .class 파일이 생성됩니다. 그러나 컴파일 중에 -target 8 을 전달하면 .class 파일의 버전은 52가 됩니다.

4. .class 버전 hexdump

Hex 편집기를 사용하여 버전을 확인할 수도 있습니다. Java 클래스 파일은 사양 을 따릅니다 . 구조를 살펴보겠습니다.

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    // other details
}

여기서 u1 , u2u4 유형 은 각각 무부호 1, 2 및 4바이트 정수를 나타냅니다. u4
클래스 파일 형식을 식별하는 매직 넘버입니다. 값은 0xCAFEBABE이고 u2 는 주 버전입니다.

Linux 기반 시스템의 경우 hexdump 유틸리티를 사용하여 .class 파일 을 구문 분석할 수 있습니다 .

> hexdump -v Sample.class
0000000 ca fe ba be 00 00 00 34 00 22 07 00 02 01 00 0b
0000010 74 65 73 74 2f 53 61 6d 70 6c 65 07 00 04 01 00
...truncated

이 예제에서는 JDK8을 사용하여 컴파일했습니다. 첫 번째 줄의 7 및 8 인덱스는 클래스 파일의 주 버전을 제공합니다. 따라서 0034는 16진수 표현이고 JDK8은 해당 릴리스 번호입니다(이전에 본 매핑 테이블에서 가져옴).

또는 hexdump 를 사용하여 주 릴리스 버전을 십진수로 직접 가져올 수 있습니다 .

> hexdump -s 7 -n 1 -e '"%d"' Sample.class
52

여기서 출력 52는 JDK8에 해당하는 클래스 버전입니다.

5. 항아리 버전

Java 생태계의 jar 파일은 함께 묶인 클래스 파일 모음으로 구성됩니다. jar가 빌드 또는 컴파일된 Java 버전 을 확인 하기 위해 jar 파일을 추출하고 javap 또는 hexdump 를 사용하여 .class 파일 버전 을 확인할 수 있습니다.

jar 파일에는 사용된 JDK에 대한 일부 헤더 정보가 포함된 MANIFEST.MF 파일 도 있습니다 .

예를 들어 Build-Jdk 또는 Created-By 헤더는 jar 빌드 방법에 따라 JDK 값을 저장합니다.

Build-Jdk: 17.0.4

또는

Created-By: 17.0.4

5. 결론

이 기사에서는 . 클래스 파일. javaphexdump 명령과 버전을 찾기 위한 사용법을 살펴 보았습니다 . 또한 jar 파일에서 Java 버전을 확인하는 방법을 살펴보았습니다.

Generic footer banner