我如何知道哪个版本的Java编译器被用来构建一个jar?我有一个jar文件,它可以构建在三个jdk中的任何一个中。我们需要确切知道是哪一个,这样我们才能证明兼容性。编译器版本是否嵌入到类文件或jar中?
当前回答
你可以使用十六进制编辑器从.class文件中找到Java编译器版本。
步骤1: 使用zip提取器从jar文件中提取.class文件
第二步:用十六进制编辑器打开。class文件。(我已经使用notepad++十六进制编辑器插件。这个插件读取文件为二进制并显示为十六进制) 如下图所示。
索引6和7给出了所使用的类文件格式的主要版本号。 https://en.wikipedia.org/wiki/Java_class_file
Java SE 11 = 55 (0x37十六进制)
Java SE 10 = 54 (0x36十六进制)
Java SE 9 = 53 (0x35十六进制)
Java SE 8 = 52 (0x34十六进制),
Java SE 7 = 51 (0x33十六进制),
Java SE 6.0 = 50 (0x32十六进制),
Java SE 5.0 = 49 (0x31十六进制),
JDK 1.4 = 48 (0x30十六进制),
JDK 1.3 = 47 (0x2F十六进制),
JDK 1.2 = 46 (0x2E十六进制),
JDK 1.1 = 45 (0x2D十六进制)。
其他回答
Owen发布的代码可以告诉你一些其他答案中提到的信息:
public void simpleExample ()
{
FileInputStream fis = new FileInputStream ("mytest.class");
parseJavaClassFile ( fis );
}
protected void parseJavaClassFile ( InputStream classByteStream ) throws Exception
{
DataInputStream dataInputStream = new DataInputStream ( classByteStream );
magicNumber = dataInputStream.readInt();
if ( magicNumber == 0xCAFEBABE )
{
int minorVer = dataInputStream.readUnsignedShort();
int majorVer = dataInputStream.readUnsignedShort();
// do something here with major & minor numbers
}
}
也可以看看这个和这个网站。最后,我迅速修改了Mind Products代码,以检查我的每个依赖项是为了什么而编译的。
一行程序(Linux)
解压-p mylib.jar META-INF/MANIFEST. jar曼氏金融
这将打印MANIFEST的内容。MF文件转换为stdout(希望你的jar文件中有一个:)
根据构建包的方式,您将在“Created-By”或“Build-Jdk”键中找到JDK版本。
我基于david的建议使用file命令构建了一个小bash脚本(在github上)
不需要解包JAR(如果其中一个类名已知或被查找,例如使用7zip),因此在Windows上,以下步骤就足够了:
javap -cp log4j-core-2.5.jar -verbose org.apache.logging.log4j.core.Logger | findstr major
你可以在命令行上使用以下过程轻松完成:
如果你知道jar中的任何一个类名,你可以使用以下命令:
javap -cp jarname.jar -verbose packagename.classname | findstr major
例子:
C:\pathwherejarlocated> javap -cp jackson-databind-2.8.6.jar -verbose com.fasterxml.jackson.databind.JsonMappingException | findstr major
输出:
major version: 51
快速参考:
JDK 1.0 — major version 45
DK 1.1 — major version 45
JDK 1.2 — major version 46
JDK 1.3 — major version 47
JDK 1.4 — major version 48
JDK 1.5 — major version 49
JDK 1.6 — major version 50
JDK 1.7 — major version 51
JDK 1.8 — major version 52
JDK 1.9 — major version 53
PS:如果你不知道任何类名,你可以很容易地做到这一点 使用任何jar反编译器或简单地使用以下命令来提取jar文件 : myFile.jar
推荐文章
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- Mockito.any()传递带有泛型的接口
- 在IntelliJ 10.5中运行测试时,出现“NoSuchMethodError: org.hamcrest. matcher . descripbemismatch”
- 使用String.split()和多个分隔符
- Java数组有最大大小吗?
- 在Android中将字符串转换为Uri
- 从JSON生成Java类?
- 为什么java.util.Set没有get(int index)?
- Swing和AWT的区别是什么?
- 为什么Java流是一次性的?
- 四舍五入BigDecimal *总是*有两位小数点后
- 设计模式:工厂vs工厂方法vs抽象工厂
- Java:检查enum是否包含给定的字符串?
- 它的意思是:序列化类没有声明一个静态的最终serialVersionUID字段?