现在不妨从 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" ............................/>
相关推荐
32位ubuntu使用的JDK。 版本号是1.6.0_37。编译Android源码必备利器
超好用的反编译工具,支持class文件jdk版本号查看
文件版本为dubbo-admin-2.5.6,解决jdk1.8.5版本启动报错问题,用户root密码root. 此包已经经过maven 编译,可以直接启动tomcat.记得检查或修改tomcat端口号。
以jdk1.7.0为例,你可以根据你的jdk版本号及安装路径进行相应的修改 我采用默认安装,将jdk1.7.0安装在C:\Program Files\Java\jdk1.7.0 下面为详细配置: 1.JAVA_HOME JAVA_HOME指向的是JDK的安装路径 在该...
内含: 1.将class文件反编译为java文件的工具jad.exe 2.eclipse的反编译插件net.sf.jadclipse_3.3.0.jar(方便查看源代码) 插件安装方法: ... 注意:jadclipse_3.1.0.jar的版本与eclipse的platform版本号相关
9.java se development 8uN ,其中N是JDK更新版本号。 10.java安装时要理解这三个东西,安装是否成功输入java 命令测试一下工具是否可用。 11.java安装目录详解https://zhidao.baidu.com/question/181908777.html ...
linux系统64位1.6版本的oracle jdk,可用于编译Android4.4源码。因为Oracle官网需要注册账号才能下载。有需要的可以下载这个。
查看版本号:apktool -version 拆包命令(反编译)和打包用apktool命令 拆包命令: apktool d -s E:\apk\GB\gb.apk -o E:\apk\GB1 (注意:输入目录和输出目录不能一样,新版的必须输入绝对路径) 打包命令: ...
Linux环境下maven编译好的RocketMQ最新版本4.3.0;centos_64+maven-3.2.5+jdk-1.8
插件安装方法: 1、下载eclipse插件:jadclipse_3.1.0.jarhttp://jadclipse.sourceforge.net/ 2、 下载Jad反编译工具:jad.exehttp://... 注意:jadclipse_3.1.0.jar的版本与eclipse的platform版本号相关
上传的tools.jar的版本号为1.8.0_181,是一个zip压缩文件,解压就可以 而自己安装jdk的tools.jar在jdk下的lib中 jdk和jre的区别: Jre是运行环境,及编译后的java程序运行时只需要jre就行了; jdk是开发环境,当...
1.2 测试Git是否安装成功:在cmd中输入 git --version(注意是两个-),能看到版本号就说明安装成功 二、安装JDK 2.1 因为源码使用Java写的,所以需要JDK 2.2 对于JDK的版本,由于源码比较老,官网推荐使用8的版本...
有源码,有class文件和jar文件. 没有完全破解. 其实soapui 4.5的破解文件通杀所有soapui和soapui ng(不包括readyapi,loadui...) 1,破解方法有多种(我只是修改了一些...readyapi中 soapui内部版本号为6.0,外部版本号为5.2
代表版本号)复制到%ECLIPSE_HOME%\plugins目录下。 方法2、使用link方式安装,建立D:\Myplugins\jadclipse3.2.4\eclipse\plugins的目录结构,将jadclipse_3.2.4.jar放到plugins目录下面(注:其中D:\Myplugins...
1.14 Spring Boot改变JDK编译版本 1.15 处理静态资源(默认资源映射) 1.16 处理静态资源(自定义资源映射) 1.17 Spring Boot定时任务的使用 1.18 Spring Boot使用Druid和监控配置 1.19 Spring Boot使用Druid(编程...
商户验签包使用jdk1.4编译,可在jdk1.4及以上版本中运行; 将xml配置文件和jar包放在同一目录下。 1.3 参数配置说明 配置文件名称:ccbnetpayconfig.xml <!-- 中国建设银行商户通知验签配置文件 --> <!-- 通讯...
第2章 Java语言开发环境(第7版),讲解Java的开发环境部署。 1.安装JDK 安装JDK的同时会安装JRE ...打开运行窗口输入cmd回车,弹出窗口输入“javac -version”回车后弹出命令是javac+版本号那就证明环境配置成功了
org.json.jsonobject等6个jar压缩包集合。包含JSONObject所必需的6个jar包: commons-beanutils-1.7.0.jar commons-collections-3.1.jar ...版本号都比网上的新。我单独使用json-20200518.jar编译也正常
java -version 出现jdk版本号,ps:注意java和javac都是命令(动词),后面-version可理解为宾语,中间是有空格的,切记!!! 特别注意: 在 cmd 中,输入 set java_home命令可以看到jdk安装目录; set path ...
Subversion Workspace Version:SVN的版本号,选择你对应的版本号 2.4.邮件通知配置 配置发件人地址 系统管理员邮件地址:Jenkins邮件发送地址 配置邮件通知 3.构建任务 增值服务器端,...