저는 데비안 버스터를 실행 중이고 기본적으로 openjdk로 플레이한 아주 오래된 Java 게임이 있지만 정확한 버전이 기억나지 않습니다. 그래서 javap를 사용하여 jar 파일이 어떤 Java 버전으로 컴파일되었는지 확인하려고 합니다.
javap -v java-spiele/edna_bricht_aus/Edna.jar
Error: class not found: java-spiele/edna_bricht_aus/Edna.jar
기본 자바 버전은
java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.13+8-post-Debian-1deb10u1, mixed mode, sharing)
어쩌면 새로운 것일 수도 있습니다. 그래서 Stretch repo에서 openjdk-8을 설치하고(예, Franken Debian을 알고 있습니다) 다시 시도했습니다.
/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/javap -v /home/alex/java-spiele/edna_bricht_aus/Edna.jar
Error: class not found: /home/alex/java-spiele/edna_bricht_aus/Edna.jar
비즈니스 게임에서 정보를 얻는 것도 가능합니까? openjdk-8을 사용하면 게임이 실행되지 않고 충돌이 발생합니다.
답변1
javap
JAR이 아닌 클래스가 필요합니다. JAR에서 클래스를 디스어셈블하려면 클래스 경로에 JAR을 추가하고 클래스 이름을 지정합니다. 예를 들어 게임 대신 JSTL을 사용합니다.
javap -v -classpath jstl-1.2.jar org.apache.taglibs.standard.tlv.JstlCoreTLV
JAR에서 클래스를 보려면 jar tf
;를 사용하여 슬래시를 점으로 바꿔 경로를 패키지로 변환합니다.
JAR의 모든 클래스가 어떤 Java 버전에 맞게 빌드되었는지 확인하려면 JAR에서 클래스를 추출하여 file
실행하는 것이 가장 좋습니다.
mkdir foo
cd foo
jar xf ../java-spiele/edna_bricht_aus/Edna.jar
find . -name \*.class -exec file {} +
답변2
다음과 같이 jar에 클래스의 URL을 지정할 수도 있습니다 javap
.
javap -v jar:file:///path/to/MyJar.jar!/mypkg/MyClass.class