Edited at

Java 10 で変わる Java のバージョン表記

More than 1 year has passed since last update.

(この記事は 地平線に行く とのマルチポストです)

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






プログラム上での取得

これらは、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"





  1. とはいえ、Java 9 とほぼ一緒 



  2. この場合、少なくとも1つ前の機能リリースで予告されます。 



  3. JDK1.4.1, JDK1.4.2 のようなケースを想定しているそうです。 



  4. 正確には GA の日付。なので、Eary Access 版だと未来の日付になります。