如何判断编译jar的java版本范围

时间:2014-09-22 00:18:47

标签: java jar bytecode

如何查看编译的jar文件将使用哪些java版本?

由于

3 个答案:

答案 0 :(得分:6)

一般MANIFEST.MF文件将此信息作为属性,如果找不到,请提取jar并选择一个类并执行

$javap -verbose SomeClass.class  | grep 'major'
  major version: 50

and map the javac version from that major version

答案 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。