找到编译后的 class 版本号

find the compiled class version number

我的项目包含一些第三方 jar 文件,这些文件是在 java 的不同版本中编译的。 我的项目使用旧版本的 java,所以我在执行应用程序时得到 UnsupportedClassVersionError。 有没有其他方法可以获取编译了 class 文件的 java/jre number[45..51] 版本,以便我可以在使用它之前检查 jar 文件。

您可以使用 javap(对于详细模式使用 -v),并从 jar 文件中指定任何 class。例如,查看 Joda Time jar 文件:

javap -cp joda-time-2.7.jar -v org.joda.time.LocalDate

这里的 -cp 参数指定 jar 文件位于 class 路径中,-v 指定我们需要更详细的信息,然后是一个 class 在 jar 文件中。

输出开始于:

Classfile jar:file:/c:/Users/Jon/Test/joda-time-2.7.jar!/org/joda/time/LocalDate.class
  Last modified 12-Jan-2015; size 16535 bytes
  MD5 checksum d19ebb51bc5eabecbf225945eccd23ef
  Compiled from "LocalDate.java"
public final class org.joda.time.LocalDate extends org.joda.time.base.BaseLocal implements org.joda.time.ReadablePartial,java.io.Serializable
  minor version: 0
  major version: 49

"minor version" 和 "major version" 位是您感兴趣的位。

当然,单个 jar 文件可能包含 class使用不同版本编译的 es。

如果您只有标准的 Unix 工具可用,而没有 javap 命令,那么您可以获得十六进制 <minor> <major> 版本形式的 class 文件版本,如下所示:

$ dd if=YourFile.class ibs=1 skip=4 count=4 of=/dev/stdout status=none | od -An -tx2 --endian=big

示例输出。 003452 因此这个 class 是 java 8.

 0000 0034