什么版本的javac构建了我的jar?

2022-08-31 05:39:28

如何判断 Java 编译器的哪个版本用于构建 jar?我有一个jar文件,它可以在三个JDK中的任何一个中构建。我们需要确切地知道哪一个,以便我们可以证明兼容性。编译器版本是否嵌入在类文件或 jar 中的某个位置?


答案 1

A 只是一个容器。它是一个文件存档 ā la tarzip。虽然 它的 META-INF 层次结构中可能包含有趣的信息,但它没有义务在其内容中指定类的年份。为此,必须检查其中的文件。jarjarclass

正如Peter Lawrey在对原始问题的评论中提到的,你不一定知道哪个JDK版本构建了一个给定的文件,但你可以找出包含在.classclassjar

是的,这有点糟糕,但第一步是从中提取一个或多个类。例如:jar

$ jar xf log4j-1.2.15.jar

在 Linux、Mac OS X 或安装了 Cygwin 的 Windows 上,file(1) 命令知道类的版本。

$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3

或者,使用JDK,如@jikes.thunderbolt恰如其分地指出的那样:javap

$ javap -v ./org/apache/log4j/Appender.class | grep major
 major version: 45

对于没有或Windowsfilegrep

> javap -v ./org/apache/log4j/Appender.class | findstr major
 major version: 45

FWIW,我同意这将比原始问题更多地讲述给定文件。javapclass

无论如何,一个不同的类版本,例如:

$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0

下面的列表显示了引入该类主要版本的类版本号和 JDK 版本。

注意:类版本不一定标识用于编译类的 JDK - 它只标识可能产生类的最早版本

例如,类主要版本 52 可能是在 Java 7 之后由任何 JDK 生成的。

  • 45.3 = Java 1.1
  • 46 = Java 1.2
  • 47 = Java 1.3
  • 48 = Java 1.4
  • 49 = Java 5
  • 50 = Java 6
  • 51 = Java 7
  • 52 = Java 8
  • 53 = Java 9
  • 54 = Java 10
  • 55 = Java 11
  • 56 = Java 12
  • 57 = Java 13
  • 58 = Java 14
  • 59 = Java 15
  • 60 = Java 16
  • 61 = Java 17
  • 62 = Java 18
  • 63 = Java 19

答案 2

你不能从JAR文件本身看出。。

下载十六进制编辑器并打开 JAR 中的一个类文件,然后查看字节偏移量 4 到 7。版本信息是内置的。

http://en.wikipedia.org/wiki/Java_class_file

注意:如下面的评论所述,

这些字节告诉您类是为哪个版本编译的,而不是编译它的版本。


推荐