如何在 jar 文件上使用 javap

如何在 jar 文件上使用 javap

我正在运行 debian buster,并且有一个非常古老的 java 游戏,我用 openjdk 玩过本机游戏,但我不记得确切的版本。所以我试图用javap找出jar文件是用哪个java版本编译的。

javap -v java-spiele/edna_bricht_aus/Edna.jar 
Error: class not found: java-spiele/edna_bricht_aus/Edna.jar

默认的java版本是

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

相关内容