(この記事は 地平線に行く とのマルチポストです)
Java は、バージョン 10 以降タイムベースリリースに変わりました。
それに合わせて、バージョン表記がまた変わったので概要をまとめました。1
詳細は JEP 322: Time-Based Release Versioning を参照。
バージョン番号
$FEATURE.$INTERIM.$UPDATE.$PATCH
という4つの表記になります。
具体的には、 10.0.1.2
のような表記です。
(Java 8 までの Update ~ という表記はなくなりました)
意味 | タイミング | 次回予定 | 内容 | |
---|---|---|---|---|
$FEATURE |
機能リリース | 半年ごと | 2018年3月 | 内容にかかわらず半年ごとにリリース 機能追加や互換性のない変更、機能の削除2を含む |
$INTERIM |
中間リリース | 予定なし | - | 互換性のあるバグ修正と機能強化3 (標準APIの変更を含まない) |
$UPDATE |
アップデートリリース | 機能リリースの1ヶ月後、およびそれ以降3ヶ月ごと | 2018年4月 2018年7月 |
セキュリティの修正 最新機能のバグ修正 |
$PATCH |
パッチリリース | 必要時のみ | - | 重大な問題を解決するための最低限の修正 |
細かいルール
- ある桁以降がすべて 0 なら、省略して表記する
- 例: 11.0.0.0 → 11
- 例: 11.0.2.0 → 11.0.2
-
$FEATURE
,$INTERIM
がインクリメントされた場合、それ以降の数字はリセットする- 例: 11.0.2 → 11.0.2.1 → 11.1 → 11.1.1
- バージョン番号以降には、以下を付与する
- プレリリース識別子(optional)
- 例: 11.0.2-ea
- ビルド番号
- 例: 11.0.2+13
- LTS などのオプション情報(optional)
- 例: 11.0.2+13-LTS
- プレリリース識別子(optional)
プログラム上での取得
これらは、Runtime.Version クラスの各メソッドで取得できます。
jshell> Runtime.version().feature()
$1 ==> 10
jshell> Runtime.version().interim()
$2 ==> 0
jshell> Runtime.version().update()
$3 ==> 0
jshell> Runtime.version().patch()
$4 ==> 0
jshell> Runtime.version().pre()
$6 ==> Optional.empty
jshell> Runtime.version().build()
$5 ==> Optional[46]
jshell> Runtime.version().toString()
$7 ==> "10+46"
あるバージョンよりも新しいか?古いか?を確認するなら、上記で一つづつ比較するよりも compareTo
メソッドで比較したほうが確実です。
jshell> Runtime.version().toString()
$1 ==> "10+46"
jshell> Runtime.version().compareTo(Runtime.Version.parse("10.0.1")) > 0
$2 ==> false
jshell> Runtime.version().compareTo(Runtime.Version.parse("9.0.1")) > 0
$3 ==> true
ただ、 Runtime.Version
は Java 9 で追加されたクラスです。
もし、Java 8 以前にも対応する必要があるならば、システムプロパティ java.version
から取得するしかないのでご注意ください。
jshell> System.getProperty("java.version")
$4 ==> "10"
ちなみに
「リリース日4」「ベンダーバージョン」がシステムプロパティに追加されました。
Oracle JDK の場合、ベンダーバージョンは当初予定されていた リリース年.リリース月
という表記のままのようです。
jshell> System.getProperty("java.version.date")
$1 ==> "2018-03-20"
jshell> System.getProperty("java.vendor.version")
$2 ==> "18.3"