JDK?version和class?file?version(Class編譯版本號(hào))對(duì)應(yīng)關(guān)系解讀
JDK version和class file version(Class編譯版本號(hào))對(duì)應(yīng)關(guān)系
JDK 19 = 63,
JDK 18 = 62,
JDK 17 = 61,
JDK 16 = 60,
JDK 15 = 59,
JDK 14 = 58,
JDK 13 = 57,
JDK 12 = 56,
JDK 11 = 55,
JDK 10 = 54,
JDK 9 = 53,
JDK 8 = 52,
JDK 7 = 51,
JDK 6.0 = 50,
JDK 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45.0-45.6
可以使用下列的方式來查看
使用文本編輯器EmEditor等以16進(jìn)制方式打開.class文件,
在魔數(shù)之后的就是次版本號(hào)和主版本號(hào):
圖中紅框中的代表版本號(hào)52.0
- 次版本號(hào):00 00 (小數(shù)點(diǎn)后面的部分)
- 主版本號(hào):00 34 (小數(shù)點(diǎn)前面的部分)對(duì)應(yīng)的10進(jìn)制為52,對(duì)應(yīng)的jdk版本為jdk8
各個(gè)版本的對(duì)應(yīng)關(guān)系
JDK版本號(hào) | Class版本號(hào) | 16進(jìn)制 |
---|---|---|
1.1 | 45.0 | 00 00 00 2D |
1.2 | 46.0 | 00 00 00 2E |
1.3 | 47.0 | 00 00 00 2F |
1.4 | 48.0 | 00 00 00 30 |
1.5 | 49.0 | 00 00 00 31 |
1.6 | 50.0 | 00 00 00 32 |
1.7 | 51.0 | 00 00 00 33 |
1.8 | 52.0 | 00 00 00 34 |
備注:
文件結(jié)構(gòu)可以在JVM規(guī)范里查看,鏈接里是Java SE 19的版本 Chapter 4. The class File Format (oracle.com)
https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.1
其它jdk版本的話,更改下鏈接里的se后的值就行。
jar包對(duì)不同JDK版本的兼容性問題:Unsupported major.minor version 52.0
Unsupported major.minor version 52.0 這類錯(cuò)誤是因?yàn)镴ava版本不一致造成的,在高版本的JDK(1.8)環(huán)境中編譯JAR包,然后JAR在低版本的JVM(1.6)中運(yùn)行
The issue is because of Java version mismatch. Referring to the Wikipedia Java Class Reference :
- J2SE 8 = 52
- J2SE 7 = 51
- J2SE 6.0 = 50
- J2SE 5.0 = 49
- JDK 1.4 = 48
- JDK 1.3 = 47
- JDK 1.2 = 46
- JDK 1.1 = 45
These are the reported major numbers. The error regarding the unsupported major.minor version is because during compile time you are using a higher JDK and a lower JDK during runtime.
解決的方法
那么現(xiàn)在如果碰到這種問題該知道如何解決了吧,還會(huì)像我所見到有些兄弟那樣,去找個(gè) 1.4 的 JDK 下載安裝,然后用其重新編譯所有的代碼嗎?
其實(shí)大可不必如此費(fèi)神,我們一定還記得 javac 還有個(gè) -target 參數(shù),對(duì)啦,可以繼續(xù)使用 1.5 JDK,編譯時(shí)帶上參數(shù) -target 1.4 -source 1.4 就 OK 啦,不過你一定要對(duì)哪些 API 是 1.5 JDK 加入進(jìn)來的了如指掌,不然你的 class 文件拿到 JVM 1.4 下就會(huì) method not found。
目標(biāo) JVM 是 1.3 的話,編譯選項(xiàng)就用 -target 1.3 -source 1.3 了。
其實(shí)這種方式挺不方便,因?yàn)槟阆螺d的Eclipse工具有可能不支持低版本的JSK
所以,最簡(jiǎn)單方式還是對(duì) Eclipse 的項(xiàng)目屬性的設(shè)置(項(xiàng)目右鍵 -> properties -> Java Compiler, 設(shè)置"Compeler compliance settings"為1.6),如圖
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
本文主要介紹了SpringBoot中MyBatis使用自定義TypeHandler,當(dāng)默認(rèn)的類型映射不能滿足需求時(shí),自定義?TypeHandler?就非常有用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法
這篇文章主要介紹了SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享
這篇文章主要介紹了Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享,具有一定參考價(jià)值,這里給大家分享下,供需要的朋友了解。2017-10-10mybaits-spring的實(shí)現(xiàn)方式
這篇文章主要介紹了mybaits-spring的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05ThreadLocal線程在Java框架中的應(yīng)用及原理深入理解
這篇文章主要介紹了ThreadLocal在Java框架中的應(yīng)用及原理深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01java中字符串如何計(jì)算字節(jié)長(zhǎng)度
這篇文章主要介紹了java中字符串如何計(jì)算字節(jié)長(zhǎng)度,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Java循環(huán)創(chuàng)建對(duì)象內(nèi)存溢出的解決方法
在Java中,如果在循環(huán)中不當(dāng)?shù)貏?chuàng)建大量對(duì)象而不及時(shí)釋放內(nèi)存,很容易導(dǎo)致內(nèi)存溢出(OutOfMemoryError),所以本文給大家介紹了Java循環(huán)創(chuàng)建對(duì)象內(nèi)存溢出的解決方法,需要的朋友可以參考下2025-01-01