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"