什么版本的javac构建了我的jar?
如何判断 Java 编译器的哪个版本用于构建 jar?我有一个jar文件,它可以在三个JDK中的任何一个中构建。我们需要确切地知道哪一个,以便我们可以证明兼容性。编译器版本是否嵌入在类文件或 jar 中的某个位置?
如何判断 Java 编译器的哪个版本用于构建 jar?我有一个jar文件,它可以在三个JDK中的任何一个中构建。我们需要确切地知道哪一个,以便我们可以证明兼容性。编译器版本是否嵌入在类文件或 jar 中的某个位置?
A 只是一个容器。它是一个文件存档 ā la tar
或 zip
。虽然 它的 META-INF 层次结构中可能包含有趣的信息,但它没有义务在其内容中指定类的年份。为此,必须检查其中的文件。jar
jar
class
正如Peter Lawrey在对原始问题的评论中提到的,你不一定知道哪个JDK版本构建了一个给定的文件,但你可以找出包含在.class
class
jar
是的,这有点糟糕,但第一步是从中提取一个或多个类。例如: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
对于没有或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 生成的。
你不能从JAR文件本身看出。。
下载十六进制编辑器并打开 JAR 中的一个类文件,然后查看字节偏移量 4 到 7。版本信息是内置的。
http://en.wikipedia.org/wiki/Java_class_file
注意:如下面的评论所述,
这些字节告诉您类是为哪个版本编译的,而不是编译它的版本。