我如何知道使用什么版本的 Java 编译器来构建 jar?我有一个 jar 文件,它可以在三个 JDK 中的任何一个中构建。我们需要确切地知道是哪一个,这样我们才能证明兼容性。编译器版本是否嵌入在类文件或 jar 中的某处?
原文由 Ron Romero 发布,翻译遵循 CC BY-SA 4.0 许可协议
我如何知道使用什么版本的 Java 编译器来构建 jar?我有一个 jar 文件,它可以在三个 JDK 中的任何一个中构建。我们需要确切地知道是哪一个,这样我们才能证明兼容性。编译器版本是否嵌入在类文件或 jar 中的某处?
原文由 Ron Romero 发布,翻译遵循 CC BY-SA 4.0 许可协议
A jar
只是一个容器。它是一个文件存档 ā la tar
或 zip
。虽然 jar
的 META-INF 层次结构中可能包含有趣的信息,但它没有义务在其内容中指定类的年份。为此,必须检查其中的 class
文件。
正如 Peter Lawrey 在对原始问题的评论中提到的那样,您不一定知道哪个 JDK 版本构建了给定的 class
文件,但您可以找出 class
的字节码类版本 ---
包含在 jar
中的文件。
是的,这有点糟糕,但第一步是从 jar
中提取一个或多个类。例如:
$ jar xf log4j-1.2.15.jar
在安装了 Cygwin 的 Linux、Mac OS X 或 Windows 上, file(1) 命令知道类版本。
$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3
或者,使用来自 JDK 的 javap
@jikes.thunderbolt 恰如其分地指出:
$ javap -v ./org/apache/log4j/Appender.class | grep major
major version: 45
对于 Windows
没有 file
或 grep
的环境
> javap -v ./org/apache/log4j/Appender.class | findstr major
major version: 45
FWIW,我同意 javap
将比原始问题提供更多关于给定 class
文件的信息。
无论如何,一个不同的类版本,例如:
$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0
下面的列表显示了类版本主编号和引入该类主版本的 JDK 版本。
注意: _类版本不一定标识用于编译类的 JDK - 它仅标识可能生成它的最早版本_。
例如,类主要版本 52 可以由 Java 7 之后的任何 JDK 生成。
原文由 David J. Liszewski 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
您无法从 JAR 文件本身中分辨出来,这是必然的。
下载一个十六进制编辑器并打开 JAR 中的一个类文件并查看字节偏移 4 到 7。版本信息是内置的。
http://en.wikipedia.org/wiki/Java_class_file
注意:正如下面评论中提到的,