New Version-String Scheme(新しいJavaのバージョン表記体系)

新しいJavaのバージョン表記体系がJEP 223で提案されています.

概要

Javaのバージョン表記をメジャー,マイナーバージョンに加えてセキュリティアップデートにも対応できるような体系を作るJEPです.
また,今まで混在していたバージョン表記を統一して一つの体系として再構築していきます.

今後使われるバージョン表記は新しいバージョン表記体系で記述されます.
すでに使用されている過去のバージョン表記については変更しないようです.

バージョン表記のセキュリティアップデート対応

今までのJavaのバージョン表記はマイナーアップデートしてuXXやUpdate XXという風に記述していました.
ここではJDK7のXXというupdateには「JDK 7 Update XX」と表記していきます.

さて,JDK 7 Update 60とJDK 7 Update 55とを比較してみましょう.
この時に一体どちらのUpdateのほうがより最新のセキュリティアップデートが含まれているでしょうか?
JDK 7 Update 60」のアップデートの数字の方が「JDK 7 Update 55」よりも5つ大きいので,「JDK 7 Update 60」でしょうか?
果たして本当にそうでしょうか?

実はどちらも同じセキュリティアップデートを含んでいます.*1
現行のUpdateの表記方法では異なる二種類のアップデート(マイナーアップデートとセキュリティアップデート)を一つの数字で表していました.
このような現行のUpdateを用いる表記方法では多くの混乱を招きます.
更にこのようなUpdateを用いた際のアップデート内容の違いを理解するためには複雑な現行のバージョン体系を完全に理解しなければいけません.
ここでは現行のバージョン体系の内容については割愛します.

混在するバージョン表記への対応

更に現行のバージョン体系にはいくつもの表記方法が混在しています.
例えば,「JDK 7 Update 60」というバージョンに対しては,「JDK 7 Update 60」に加えて「JDK7u60」や「1.7.0_60」,「Java SE 7u60」といった表記がなされています.
先ほどの現行のバージョン体系のページにおいても省略記法として「JDK X Update XX」意外の表記を認めています.

このような状況が続くとプログラマは更にJavaのバージョンで混乱してしまうでしょう.

新バージョン体系

新しいバージョンの体系ではJavaのバージョンを示す「バージョンナンバー」($VNUM)と「付加情報」の2つに分けられます.

バージョンナンバー

新しいJavaのバージョン体系では,マイナーアップデートとセキュリティアップデートが分けられて,それぞれ別々の値で管理されるようになります.
メジャーバージョンを$MAJOR,マイナーアップデートに対応するマイナーバージョンを$MINOR,セキュリティアップデートに対応するセキュリティレベルを$SECURITYとして表すと,新しいバージョンナンバーは「$MAJOR.$MINOR.$SECURITY」として表されます.

  • $MAJOR:Java8やJDK8でいうところの8という数字が対応します.いわゆるJavaのバージョンのことです.
  • $MINOR:マイナーアップデートがされるとインクリメントされます.$MAJORが変わると0クリアされますが,同じ$MAJORであれば増え続けていきます.
  • $SECURITY:セキュリティアップデートがあるとインクリメントされます.$MAJORが変わると0クリアされますが,同じ$MAJORであれば増え続けていきます.

例えば,先ほどの「JDK7u60」は6回のマイナーアップデートと14回のセキュリティアップデートがあったため,「7.6.14」と表記されます.*2
分かりやすいですね.
ちなみに「JDK7U55」は「7.5.14」と表記されるので,セキュリティアップデートで比較したければ3つ目の数字を見ればセキュリティアップデートの観点では異ならないということがわかります.

ちなみに,$SECURITYのあとにも数字が続く場合があります(4番目,5番目,・・・の数字).
これらの数字の使い方は特に規定されておらず,自由に使用しても良いことになっています.

付加情報

付加情報は以下の3つの情報に分けられます.
すべてオプションなので省略可能です.
()内は使える文字です.

$PRE(文字,数字):リリース前ということを示す情報です.例えばアーリアクセスということを示すeaなどです.
$BUILD(数字):ビルドナンバーです.バージョンナンバー($VNUM)が変わった場合はリセットされます.
$OPT(文字,数字):追加のビルド情報です.例えばビルドされた日時などです.

$PREと$OPTの前には-をつけます.また,$BUILDの前には+をつけることで区別します.

例えば,JDK 9のアーリアクセス版でビルド19のバイナリ*3に対してのバージョン情報は「9.0.0-ea+19」と表記します.

省略記法

バージョンナンバーにおいて$MINORと$SECURITYが共に0であれば,それらの数字を省略することが可能です.
例えば先程の「9.0.0-ea+19」は「9-ea+19」と書くことができます.

1.8.0などの最初の1を取り除く

忌々しき1を取り除くことも提案されています.
さらば古きJava・・・

実例(おまけ)

JEP内で使われている実例をいくつか上げます.

今後のリリースの表記について
既存の体系 新しい体系
リリースの種類 long(short) long(short)
アーリアクセス 1.9.0-ea-b19(9-ea) 9.0.0-ea+19(9-ea)
メジャー 1.9.0-b100(9) 9.0.0+100(9)
セキュリティ#1 1.9.0_5-b20(9u5) 9.0.1+20(9.0.1)
セキュリティ#2 1.9.0_11-b12(9u11) 9.0.2+12(9.0.2)
マイナー#1 1.9.0_20-b62(9u20) 9.1.2+62(9.1.2)
セキュリティ#3 1.9.0_25-b15(9u25) 9.1.3+15(9.1.3)
セキュリティ#4 1.9.0_31-b08(9u31) 9.1.4+8(9.1.4)
マイナー#2 1.9.0_40-b45(9u40) 9.2.4+45(9.2.4)
過去のリリースとの対応例
実際 仮に新しい体系で表現した場合
リリースの種類(年/月) long(short) long(short)
セキュリティ(2013/04) 1.7.0_21-b11(7u21) 7.4.10+11(7.4.10)
セキュリティ(2013/06) 1.7.0_25-b15(7u25) 7.4.11+15(7.4.11)
マイナー(2013/09) 1.7.0_40-b43(7u40) 7.5.11+43(7.5.11)
セキュリティ(2013/10) 1.7.0_45-b18(7u45) 7.5.12+18(7.5.12)
セキュリティ(2014/01) 1.7.0_51-b13(7u51) 7.5.13+13(7.5.13)
セキュリティ(2014/04) 1.7.0_55-b13(7u55) 7.5.14+13(7.5.14)
マイナー(2014/05) 1.7.0_60-b19(7u60) 7.6.14+19(7.6.14)
セキュリティ(2014/07) 1.7.0_65-b20(7u65) 7.6.15+20(7.6.15)

*1:u55はセキュリティアップデートでu60はマイナーアップデートとなっているため

*2:おまけ参照

*3:従来では「1.9.0-ea-b19」