如何查看编译的jar文件将使用哪些java版本?
由于
答案 0 :(得分:6)
一般MANIFEST.MF
文件将此信息作为属性,如果找不到,请提取jar并选择一个类并执行
$javap -verbose SomeClass.class | grep 'major'
major version: 50
答案 1 :(得分:1)
以下是从此链接声明的已编译java类文件的结构:
http://en.wikipedia.org/wiki/Java_class_file
段[编辑] Java类文件结构有10个基本部分:
- 幻数:0xCAFEBABE
- 类文件格式的版本:类文件的次要版本和主要版本
- 常量池:类的常量池
- 访问标志:例如,该类是否是抽象的, 静等等。
- 此类:当前类的名称
- 超级班: 超类的名称
- 接口:类中的任何接口
- 字段:类中的任何字段
- 方法:类中的任何方法
- 属性:类的任何属性(例如,类的名称) sourcefile等。)
如您所见,第二点是版本。因此,下载一个十六进制编辑器,打开jar中的任何.class
文件,您就可以阅读该版本。
编辑: Altough我从未验证过,版本的字节偏移量假设在4到7之间,再次来自同一个链接。
编辑2:如果您更喜欢使用命令执行此操作,请检查此主题:how to check the jdk version used to compile a .class file
答案 2 :(得分:0)
Jar文件中没有这样的信息,特别是考虑到你的术语“java版本的编译jar文件将起作用”在很大程度上取决于你如何定义“将工作”。应用程序可以启动,运行一秒钟然后以异常终止。这是否已经满足您对“工作”的定义?
正如其他人所说,类文件中有一个版本号。您可以找到有关如何将该版本号映射到Java版本here的信息。
但是,该版本号仅告诉您加载该类文件所需的最小JVM版本。它不会告诉您它所针对的API。编译与Java 1.1 JVM兼容但使用Java 8 API的类文件是完全合法的。
您可以扫描Jar文件中所有类文件的所有类和成员引用,并与官方API版本进行比较,但这只会告诉您哪些是有效使用的,而不是有意使用的。例如。应用程序仍然可以依赖已修复的某些错误或缺少填充到现有API中的功能。例如。应用程序是否依赖于“JRE的AWT可以加载具有正确透明度支持的PNG图像”的要求,无法通过查看类文件版本号或它引用的API来得出结论。
指定应用程序或库所需的Java版本超出了简单Jar文件的范围,例如:您可以查看OSGi或Java Webstart。