Movatterモバイル変換


[0]ホーム

URL:


S-JIS[2017-09-22/2025-09-17]変更履歴

Javaバージョン

Javaのバージョンについて。


概要

自分が初めて使ったJavaはたぶんJDK(Java Development Kit)1.3、バージョンを意識し始めたのはJDK1.4からなので、昔の事は知らないんだけど。

JDK1.2でJDK1.1より大幅に改善されたらしく、宣伝(マーケティング)の都合でJava2と名付けられ、Java2 Standard Edition(J2SE)と表記されていた。
JDK1.5からは「2」が取れてJava 5.0という名称になったが、SEはJ2SE 5.0だったと思う。
JDK1.6からは「.0」が取れてJavaSE6という名称になった。
JDK1.7はJavaSE7あるいはJava7と呼ばれ、JDK1.8はJava8と言われることが多い。

この間、javaコマンドで表示されるバージョン等は1.8.0という感じだったので、自分はほぼ一貫して「JDK1.n」と表記してきた。
しかしJava9でバージョン体系が変わり、JDK9(Java SE Development Kit 9)が正式となった。


Javaバージョン

javaコマンドの「--version」オプションはJava9から使えるようになった。

javacコマンドの「-version」オプションはJDK1.5から使えるようになった。
Java9(JDK9)から「--version」オプションも使えるようになった。
また、Java8までは標準エラーに出力されたが、Java9から標準出力になったようだ。

Java9からバージョンの形式が大幅に変わったので、もし判定に使っているなら注意が必要。

Javaのバージョン表記の例
 java -versionjava --versionjava -fullversionjava --full-version
JDK 1.4java version "1.4.2_19"標準エラー×××
JDK 1.5java version "1.5.0_22"×××
JDK 1.6java version "1.6.0_45"×××
JDK 1.7java version "1.7.0_40"×××
JDK 1.8java version "1.8.0_112"×××
JDK 9java version "9"java 9標準出力java full version "9+181"標準エラーjava 9+181標準出力
JDK 10java version "10.0.1" 2018-04-17java 10.0.1 2018-04-17java full version "10.0.1+10"java 10.0.1+10
JDK 11java version "11" 2018-09-25java 11 2018-09-25java full version "11+28"java 11+28
 インストール先
ディレクトリー名
javac -versionjavac --version更新日
JDK 1.4j2sdk1.4.2_19×× 
JDK 1.5jdk1.5.0_22javac 1.5.0_22標準エラー× 
JDK 1.6jdk1.6.0_45javac 1.6.0_45× 
JDK 1.7jdk1.7.0_40javac 1.7.0_40× 
JDK 1.8jdk1.8.0_112javac 1.8.0_112× 
JDK 9jdk-9javac 9標準出力同左 
JDK 10jdk-10.0.1javac 10.0.1同左2018-04-30
JDK 11jdk-11javac 11同左2018-10-01

システムプロパティーで取得できるバージョン

システムプロパティーでも実行中のJavaVMのバージョン情報が保持されている。[/2017-09-22]

システムプロパティー値の例内容備考
Java6Java7Java9
java.class.version50.051.053.0“Javaクラスの形式”のバージョン実行可能なclassファイルのバージョンと思われる
java.specification.nameJava Platform API SpecificationJava Platform API SpecificationJava Platform API SpecificationJREの仕様バージョン実行可能な仕様を示すバージョン
java.specification.version1.61.79
java.specification.vendorSun Microsystems Inc.Oracle CorporationOracle Corporation
java.version1.6.0_021.7.09  
java.vendorSun Microsystems Inc.Oracle CorporationOracle Corporation
java.vendor.urlhttp://java.sun.com/http://java.oracle.com/http://java.oracle.com/
java.vm.nameJava HotSpot(TM) Client VMJava HotSpot(TM) Client VMJava HotSpot(TM) 64-Bit Server VMJavaVMのバージョン 
java.vm.version1.6.0_02-b06
11.3-b02
21.0-b179+181
java.vm.vendorSun Microsystems Inc.Oracle CorporationOracle Corporation
java.runtime.nameJava(TM) SE Runtime EnvironmentJava(TM) SE Runtime EnvironmentJava(TM) SE Runtime EnvironmentJREのバージョンJavaVMの詳細なバージョン
java.runtime.version1.6.0_13-b031.7.0-b1479+181
java.vm.specification.nameJava Virtual Machine SpecificationJava Virtual Machine SpecificationJava Virtual Machine SpecificationJavaVMの仕様バージョン 
java.vm.specification.version1.01.79
java.vm.specification.vendorSun Microsystems Inc.Oracle CorporationOracle Corporation
java.vm.infomixed mode, sharingmixed mode, sharingmixed mode  
java.homeC:\Program Files\Java\jre1.6.0_02C:\Program Files\Java\jdk1.7.0\jreC:\Program Files\Java\jdk-9Javaのインストール先ディレクトリー 

classバージョン

javacコマンドでコンパイルするとclassファイルが作られるが、classファイルの中には「どのバージョンのJavaVMで実行できるか」という“Javaクラスの形式”のバージョンが書かれる。[2007-05-15]
JavaVM(javaコマンド)では実行できるバージョンが限られており、自分より新しいバージョンで作られたclassファイルは実行することが出来ない(古すぎてもダメ)。
(実行しようとすると、「java.lang.UnsupportedClassVersionError:クラス名 (Unsupported major.minor versionMj.Mi)」の例外が発生する。Mj.Miは、対象クラスのメジャーバージョンとマイナーバージョン。→native2asciiの例

JavaVMのバージョン
JRE(JavaVM)
仕様バージョン
VMがサポートしている
Javaクラスの形式
のバージョン

(メジャーバージョン.
マイナーバージョン)
更新日
1.448.0 
1.549.0 
1.650.0 
1.751.0 
1.852.0 
953.02017-09-22
1054.02018-04-30
1155.02018-10-01
12
12 preview
56.0
56.65535
2019-03-31
13
13 preview
57.0
57.65535
2019-09-22
14
14 preview
58.0
58.65535
2020-03-21
15
15 preview
59.0
59.65535
2020-09-16
16
16 preview
60.0
60.65535
2021-03-21
17
17 preview
61.0
61.65535
2021-09-19
18
18 preview
62.0
62.65535
2022-03-23
19
19 preview
63.0
63.65535
2022-09-21
20
20 preview
64.0
64.65535
2023-03-22
21
21 preview
65.0
65.65535
2023-09-23
22
22 preview
66.0
66.65535
2024-03-22
23
23 preview
67.0
67.65535
2024-09-22
24
24 preview
68.0
68.65535
2025-03-19
25
25 preview
69.0
69.65535
2025-09-17

1.6とかのjavaのバージョンと、それがサポートしている50.0とかの数値との対応を(実際に試す以外に)どうやって知るのかは不明。
ただ、com.sun.tools.javac.jvm.Target(Java9以降?)でその対応付けが記述されているようだ。[2020-09-16]

Java20で、ClassFileFormatVersionという列挙型が追加された。[2022-03-22]
これを見れば、クラスファイルのメジャーバージョンの数値が分かる。


JDK1.5以上のjavapを使えば、classファイルの実行可能バージョンを表示することが出来る。

>javap -v Test…Test.classを表示する例。-vは-verboseのことらしい。Compiled from "Test.java"public class Test extends java.lang.ObjectSourceFile: "Test.java"minor version:0major version:50

50.0だと、50.0に対応しているJavaVM(つまりJRE1.6のjavaコマンド)で実行できる、ということになる。
ちなみに、JDK1.4.0のjavapではバージョンは表示されず、JDK1.4.2_13では正しい値が表示されない(メジャーバージョンの箇所にマイナーバージョンの値がそのまま出てた(爆))

UNIXの場合は、fileコマンドでもclassファイルのバージョンを知ることが出来る。

なお、classファイルの中をバイナリーエディターで見てみると、先頭部分が以下のようになっている。

00000000 : CA FE BA BE00 00 00 32  00 1D 0A 00 06 00 0F 09                       ~~~~~ ~~~~~                       ↑    ↑メジャーバージョン:十六進数の0032十進数の50                       ↑マイナーバージョン:0000

classファイルのメジャーバージョン/マイナーバージョンは、javacの-target(JDK9は--release)で指定した対象JavaVMバージョンの値によって異なってくる。
-targetを省略した場合は-sourceの値に左右される。
-targetで指定するのは1.4とか1.5とか1.6というJREの仕様バージョンだが、classファイル内に保持されている値は48.0とか49.0とか50.0という数字(Javaクラスの形式のバージョン)。

生成されるバージョンの対応表(試行結果)[/2018-04-30]
-sourceの指定-targetの指定JDK(javac)のバージョン
1.4.01.4.21.5.01.6.01.7.01.8.091011
なしなし46.046.049.050.051.052.053.054.055.0
1.2以下1.2×46.046.046.046.046.0△×× 
1.3以下1.347.047.047.047.047.047.0△×× 
1.4以下1.448.048.048.048.048.048.0△×× 
1.5以下1.5××49.049.049.049.0△×××
1.6以下1.6×××50.050.050.050.0△50.0△50.0△
1.7以下1.7    51.051.051.051.051.0
1.81.8     52.052.052.052.0
1.9 or 91.9 or 9      53.053.053.0
1.10 or 101.10 or 10       54.054.0
1111        55.0
1.1なし×××××××× 
1.2なし×46.048.048.048.048.0△×× 
1.3なし46.046.048.048.048.048.0△×× 
1.4なし48.048.048.048.048.048.0△×× 
1.5なし××49.050.051.052.0△×××
1.6なし×××50.051.052.053.0△54.0△55.0△
1.7なし    51.052.053.054.055.0
1.8なし     52.053.054.055.0
1.9 or 9なし      53.054.055.0
1.10 or 10なし       54.055.0
11なし        55.0

つまり、-targetを指定すれば、当然そのターゲットJavaVM向けのバージョンになる。
-sourceのみを指定した場合は、そのバージョンで動く(その時点での)なるべく最新のバージョンになる。
何も指定しなかった場合は、(Sunがサポートしても良いと思っている最古の?/Sunが推奨しようと思っている?)デフォルトのバージョンになる。
(JDK1.4までは「なるべく古いJREでも動くように」。JDK1.5からは「なるべく新しいJREでも動くように」という考えっぽい?)
のかな?

ターゲットのバージョンによってはclassファイルの中身(仕様・フォーマット)が違ったりするようで、新しく増えた命令とかがあったりするみたい。バージョンにそぐわない命令があったり、変な状況(ftpに失敗してclassファイルが壊れたり)で実行したりするとjava.lang.ClassFormatErrorが出るらしい。


Java9以降は--releaseでコンパイル対象バージョンを指定する。[/2025-09-17]

--releaseの指定JDK(javac)のバージョン
9101112192025
なし53.054.055.056.0 63.064.0 69.0
650.0△×
751.051.0△×
852.052.0△
953.0
10 54.0
11  55.0
12   56.0
         
19     63.0
20      64.0
         
25        69.0

OracleのJavaサポート期間

Javaの各バージョンに対するOracleのサポート期間について。[2022-03-24]
(JDKを提供している各社のサポート期間は異なる)

Java
バージョン
Oracle
LTS
Oracle
開始・期限
備考
72011/72019/7 
82014/32022/3 
9 2017/92018/3 
10 2018/32018/9 
112018/92023/9次のLTSまで3年。
12 2019/32019/9 
13 2019/92020/3 
14 2020/32020/9 
15 2020/92021/3 
16 2021/32021/9 
172021/92026/9次のLTSは2年後の21(2023/9)。
18 2022/32022/9 
19 2022/92023/3[2022-09-21]
20 2023/32023/9[2023-03-22]
212023/92028/9[2023-09-23]
22 2024/32024/9[2024-09-22]
23 2024/92025/3[2024-09-22]
24 2025/32025/9[2025-03-19]
252025/92030/9[2025-03-19]
26 2026/32026/9[2025-09-17]

Oracleは、Java11以降のLTSは3年間隔としていたが、長すぎると判断した為か、Java17以降は2年間隔に改めたらしい。
LTS対象バージョン以外のサポートは半年間、つまり次のバージョンが出たら終了。


Java目次へ戻る /新機能へ戻る /技術メモへ戻る
メールの送信先:ひしだま

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


[8]ページ先頭

©2009-2025 Movatter.jp