`

JDK编译的版本号列表

    博客分类:
  • JAVA
 
阅读更多

现在不妨从 JDK 1.1 到 JDK 1.7 编译器编译出的 class 的默认 minor.major version 吧。(又走到 Sun 的网站上翻腾出我从来都没用过的古董来)

JDK 编译器版本 target 参数 十六进制 minor.major 十进制 minor.major
jdk1.1.8 不能带 target 参数 00 03   00 2D 45.3
jdk1.2.2 不带(默认为 -target 1.1) 00 03   00 2D 45.3
jdk1.2.2 -target 1.2 00 00   00 2E 46.0
jdk1.3.1_19 不带(默认为 -target 1.1) 00 03   00 2D 45.3
jdk1.3.1_19 -target 1.3 00 00   00 2F 47.0
j2sdk1.4.2_10 不带(默认为 -target 1.2) 00 00   00 2E 46.0
j2sdk1.4.2_10 -target 1.4 00 00   00 30 48.0
jdk1.5.0_11 不带(默认为 -target 1.5) 00 00   00 31 49.0
jdk1.5.0_11 -target 1.4 -source 1.4 00 00   00 30 48.0
jdk1.6.0_01 不带(默认为 -target 1.6) 00 00   00 32 50.0
jdk1.6.0_01 -target 1.5 00 00   00 31 49.0
jdk1.6.0_01 -target 1.4 -source 1.4 00 00   00 30 48.0
jdk1.7.0 不带(默认为 -target 1.6) 00 00   00 32 50.0
jdk1.7.0 -target 1.7 00 00   00 33 51.0
jdk1.7.0 -target 1.4 -source 1.4 00 00   00 30 48.0
Apache Harmony 5.0M3 不带(默认为 -target 1.2) 00 00   00 2E 46.0
Apache Harmony 5.0M3 -target 1.4 00 00   00 30 48.0


上面比较是 Windows 平台下的 JDK 编译器的情况,我们可以此作些总结:

1) -target 1.1 时 有次版本号,target 为 1.2 及以后都只用主版本号了,次版本号为 0
2) 从 1.1 到 1.4 语言差异比较小,所以 1.2 到 1.4 默认的 target 都不是自身相对应版本
3) 1.5 语法变动很大,所以直接默认 target 就是 1.5。也因为如此用 1.5 的 JDK 要生成目标为 1.4 的代码,光有 -target 1.4 不够,必须同时带上 -source 1.4,指定源码的兼容性,1.6/1.7 JDk 生成目标为 1.4 的代码也如此。
4) 1.6 编译器显得较为激进,默认参数就为 -target 1.6。因为 1.6 和 1.5 的语法无差异,所以用 -target 1.5 时无需跟着 -source 1.5。
5) 注意 1.7 编译的默认 target 为 1.6
6) 其他第三方的 JDK 生成的 Class 文件格式版本号同对应 Sun 版本 JDK
7) 最后一点最重要的,某个版本的 JVM 能接受 class 文件的最大主版本号不能超过对应 JDK 带相应 target 参数编译出来的 class 文件的版本号

上面那句话有点长,一口气读过去不是很好理解,举个例子:1.4 的 JVM 能接受最大的 class 文件的主版本号不能超过用 1.4 JDK 带参数 -target 1.4 时编译出的 class 文件的主版本号,也就是 48。

因为 1.5 JDK 编译时默认 target 为 1.5,出来的字节码 major.minor version 是 49.0,所以 1.4 的 JVM 是无法接受的,只有抛出错误。

那么又为什么从 1.1 到 1.2、从 1.2 到 1.3 或者从 1.3 到 1.4 的 JDK 升级不会发生 Unsupported major.minor version 的错误呢,那是因为 1.2/1.3/1.4 都保持了很好的二进制兼容性,看看 1.2/1.3/1.4 的默认 target 分别为 1.1/1.1/1.2 就知道了,也就是默认情况下1.4 JDK 编译出的 class 文件在 JVM 1.2 下都能加载执行,何况于 JVM 1.3 呢?(当然要去除使用了新版本扩充的 API 的因素)

六:找到问题解决的方法

那么现在如果碰到这种问题该知道如何解决了吧,还会像我所见到有些兄弟那样,去找个 1.4 的 JDK 下载安装,然后用其重新编译所有的代码吗?其实大可不必如此费神,我们一定还记得 javac 还有个 -target 参数,对啦,可以继续使用 1.5 JDK,编译时带上参数 -target 1.4 -source 1.4 就 OK 啦,不过你一定要对哪些 API 是 1.5 JDK 加入进来的了如指掌,不能你的 class 文件拿到 JVM 1.4 下就会 method not found。目标 JVM 是 1.3 的话,编译选项就用 -target 1.3 -source 1.3 了。

相应的如果使用 ant ,它的 javac 任务也可对应的选择 target 和 source

<javac target="1.4" source="1.4" ............................/>

分享到:
评论

相关推荐

    ubuntu的JDK1.6.0_37

    32位ubuntu使用的JDK。 版本号是1.6.0_37。编译Android源码必备利器

    decomp反编译工具

    超好用的反编译工具,支持class文件jdk版本号查看

    可以在jdk1.8环境下运行的dubbo-admin版本

    文件版本为dubbo-admin-2.5.6,解决jdk1.8.5版本启动报错问题,用户root密码root. 此包已经经过maven 编译,可以直接启动tomcat.记得检查或修改tomcat端口号。

    JDK1[1].7环境配置

    以jdk1.7.0为例,你可以根据你的jdk版本号及安装路径进行相应的修改 我采用默认安装,将jdk1.7.0安装在C:\Program Files\Java\jdk1.7.0 下面为详细配置: 1.JAVA_HOME JAVA_HOME指向的是JDK的安装路径 在该...

    java反编译工具及eclipse插件

    内含: 1.将class文件反编译为java文件的工具jad.exe 2.eclipse的反编译插件net.sf.jadclipse_3.3.0.jar(方便查看源代码) 插件安装方法: ... 注意:jadclipse_3.1.0.jar的版本与eclipse的platform版本号相关

    java jdk8 学习笔记

    9.java se development 8uN ,其中N是JDK更新版本号。 10.java安装时要理解这三个东西,安装是否成功输入java 命令测试一下工具是否可用。 11.java安装目录详解https://zhidao.baidu.com/question/181908777.html ...

    OracleJDK:jdk-6u31-linux-x64.bin

    linux系统64位1.6版本的oracle jdk,可用于编译Android4.4源码。因为Oracle官网需要注册账号才能下载。有需要的可以下载这个。

    Android apk拆包(反编译)工具套装:java JDK、apktool包

    查看版本号:apktool -version 拆包命令(反编译)和打包用apktool命令   拆包命令: apktool d -s E:\apk\GB\gb.apk -o E:\apk\GB1 (注意:输入目录和输出目录不能一样,新版的必须输入绝对路径) 打包命令: ...

    Linux环境下maven编译好的RocketMQ最新版本4.3.0

    Linux环境下maven编译好的RocketMQ最新版本4.3.0;centos_64+maven-3.2.5+jdk-1.8

    jd_gui jad eclipse 反编译工具

    插件安装方法:  1、下载eclipse插件:jadclipse_3.1.0.jarhttp://jadclipse.sourceforge.net/  2、 下载Jad反编译工具:jad.exehttp://... 注意:jadclipse_3.1.0.jar的版本与eclipse的platform版本号相关

    tools-1.8.0_181.jar.zip

    上传的tools.jar的版本号为1.8.0_181,是一个zip压缩文件,解压就可以 而自己安装jdk的tools.jar在jdk下的lib中 jdk和jre的区别: Jre是运行环境,及编译后的java程序运行时只需要jre就行了; jdk是开发环境,当...

    Windows下EarthSci编译教程

    1.2 测试Git是否安装成功:在cmd中输入 git --version(注意是两个-),能看到版本号就说明安装成功 二、安装JDK 2.1 因为源码使用Java写的,所以需要JDK 2.2 对于JDK的版本,由于源码比较老,官网推荐使用8的版本...

    readyAPI1.41最新半破解版

    有源码,有class文件和jar文件. 没有完全破解. 其实soapui 4.5的破解文件通杀所有soapui和soapui ng(不包括readyapi,loadui...) 1,破解方法有多种(我只是修改了一些...readyapi中 soapui内部版本号为6.0,外部版本号为5.2

    Java反编译Jad大全:jad.1.5.8+net.sf.jadclipse_3.3.0+配置方法

    代表版本号)复制到%ECLIPSE_HOME%\plugins目录下。 方法2、使用link方式安装,建立D:\Myplugins\jadclipse3.2.4\eclipse\plugins的目录结构,将jadclipse_3.2.4.jar放到plugins目录下面(注:其中D:\Myplugins...

    从零开始学Spring Boot

    1.14 Spring Boot改变JDK编译版本 1.15 处理静态资源(默认资源映射) 1.16 处理静态资源(自定义资源映射) 1.17 Spring Boot定时任务的使用 1.18 Spring Boot使用Druid和监控配置 1.19 Spring Boot使用Druid(编程...

    建行互联网被扫支付接口Socket商户验签jar包

    商户验签包使用jdk1.4编译,可在jdk1.4及以上版本中运行; 将xml配置文件和jar包放在同一目录下。 1.3 参数配置说明 配置文件名称:ccbnetpayconfig.xml &lt;!-- 中国建设银行商户通知验签配置文件 --&gt; &lt;!-- 通讯...

    第2章 Java语言开发环境(第7版),讲解Java的开发环境部署

    第2章 Java语言开发环境(第7版),讲解Java的开发环境部署。 1.安装JDK 安装JDK的同时会安装JRE ...打开运行窗口输入cmd回车,弹出窗口输入“javac -version”回车后弹出命令是javac+版本号那就证明环境配置成功了

    org.json等6个jar压缩包.rar

    org.json.jsonobject等6个jar压缩包集合。包含JSONObject所必需的6个jar包: commons-beanutils-1.7.0.jar commons-collections-3.1.jar ...版本号都比网上的新。我单独使用json-20200518.jar编译也正常

    monkey环境搭建

    java -version 出现jdk版本号,ps:注意java和javac都是命令(动词),后面-version可理解为宾语,中间是有空格的,切记!!! 特别注意: 在 cmd 中,输入 set java_home命令可以看到jdk安装目录; set path ...

    Jenkins管理员操作手册.docx

    Subversion Workspace Version:SVN的版本号,选择你对应的版本号 2.4.邮件通知配置 配置发件人地址   系统管理员邮件地址:Jenkins邮件发送地址  配置邮件通知 3.构建任务 增值服务器端,...

Global site tag (gtag.js) - Google Analytics