2019年2月以降はどこを見ればJavaリリース内容がわかるのか？問題について

※ @yamadamn さんからのコメントを元に加筆・修正してます。
※ @yamadamn さんからのコメントのきっかけとなったツイート : https://twitter.com/msakamoto_sf/status/1089117012977041408

~~2019年1月になり、いよいよOracleビルドとしてのJava8 SEの最後のDLとなった（と理解してるが、これが間違ってると以降の本記事の前提がいろいろ崩れる）。~~ 2019年1月までで終わるのは商用ユーザ向けのJava SE 8で、個人ユーザ向けには2020年12月末まで提供される。[Oracle Java SE サポート･ロードマップ](https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html) 参照のこと。
→商用ユーザ向けのJava SE8、つまりビジネスで開発するためのJDK8 および開発したソフトウェアを動かすためのJava8のJRE環境については「[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit) / [Javaは今も無償です](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)」 の冒頭にも記載があるとおり、"JDKバイナリ" が必要であればRedHat, AdoptOpenJDK, Azul, IBM などからそれぞれの無償LTSとして提供されるJava8 OpenJDK を使うことになる、と思われる。以下、日本語訳から引用：
> 2019年1月以降にJava SE 8をアップデートが必要なら、OpenJDKプロバイダから配布されるOpenJDKバイナリを使ってください。OpenJDKプロバイダは、たとえばLinuxディストリビュータやAdoptOpenJDK、Azul、 IBM、レッドハットなどです。

完全に個人の趣味で動かすだけのJDK8であれば、個人ユーザ向けとして2020年12月末まで提供される。これについては「[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit) / [Javaは今も無償です](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)」の「Q. 商用ソフトウェアの実行にOracle JDK 8を使っている場合、2019年1月移行はライセンスを購入する必要がありますか？」に回答があり、日本語訳より引用：
>  また、Oracle JDK 8は、少なくとも2020年まで個人のデスクトップでの利用に対して無償でアップデートが提供されることにも注意してください。

というわけで、今後もJava8 SE(OpenJDKベース、さらに正確には public JREだけでなくJDKの方も含めて)を商用の開発案件で使おうとしたら、AdoptOpenJDK や Azul Systems の Zulu, IBM, RedHatLinux, AWS Correto などが提供するLTSを使うことになる。
またJava11もいよいよLTSになる。予定どおりなら、2019年3月には OpenJDK 12 がリリースされる。

そうなったときに、Javaのリリース情報はどこを見れば良いのか？というのがわからなくなった。

- Oracle公式バイナリは2種類。
  - フィーチャー・リリース: 3月/9月にリリースされる、Java11, 12, 13, ... と進んでく。
  - アップデート・リリース: 四半期ごとの1月, 4月, 7月, 10月にリリースされる。その時点でのフィーチャー・リリースに対する脆弱性やバグ修正などが含まれる。
- その他のベンダによるリリース
  - OpenJDKベース(HotSpot)はどうなるのだろうか。OpenJDKに合わせるなら、Oracle公式バイナリに揃えてリリースされる？

## フィーチャー・リリースの内容

新しいリリースサイクルにおける「フィーチャー・リリース」とはJava9, 10, 11, 12, ... と進んでく、以前の「メジャーリリース」に代わるもの。

- フィーチャー・リリースのリリース内容については https://jdk.java.net/ を見れば良さそう。
- Oracle公式バイナリについては https://www.oracle.com/technetwork/java/javase/downloads/index.html からアップデート・リリース含めて辿れる。
  - ここから、各フィーチャー・リリースに対応するアップデート・リリースも含めたリリース・ノートを辿れる。
  - https://www.oracle.com/technetwork/java/javase/jdk-relnotes-index-2162236.html

フィーチャー・リリースでの機能追加は jdk.java.net と Oracle サイトの両方から辿れそうなので、いわゆるメジャーアップデートの内容は上記から辿れると思われる。

## アップデート・リリースの内容

各フィーチャー・リリースごとに、バグや脆弱性の修正が行われたアップデート・リリースが提供される。Oracleのビルドバイナリの場合は、四半期ごとの Critical Patch Update (CPU) で提供される。

- これも https://jdk.java.net/ から辿れるは辿れるのだけど、2019-01時点では、例えば https://jdk.java.net/11/ では最新のアップデート・リリースの内容(11.0.2) については辿れるが、一つ前の 11.0.1 については見つけることができなかった。
  - https://jdk.java.net/10/ に至ると、release noteのリンクが Oracle 側の JDK 10.0.2 リリース・ノートになっている。
  - （それくらいなら、最初からもう release note のリンクを全部 Oracle 側にしておけよ・・・とか思ってしまう・・・）
- 「アップデート・リリース」というのはOpenJDKに対するOracle公式ビルドのOracle側の呼び名なので、結局、最も正確で読みやすいのがOracleのサイトになってしまう。
  - セキュリティ修正について
     - https://www.oracle.com/technetwork/topics/security/alerts-086861.html
     - Java以外のOracle製品も含んだ一覧が提供されている。
  - セキュリティ以外のバグ修正も含んだ、Javaの各リリースノート全体
     - https://www.oracle.com/technetwork/java/javase/jdk-relnotes-index-2162236.html

## LTSリリースの内容

これ(LTSリリースそのものではなく、「リリースノート」としてのLTSリリースの変更点サマリ)がどうなるか、2019-01時点では見当がつかない。

- Oracleの場合、2019-02からはLTSが2バージョン(8 と 11, このうち8は有償, 11は無償・・・であってるのかな・・・？？) とフィーチャー・リリースで合計3バージョンをリリースする。
  - この場合、四半期ごとのアップデート・リリース内容はCPU側に、フィーチャー・リリースはそちらでのリリースになるのか？
- その他のLTSベンダとしては、Java8 LTSはどうなるのだろうか・・・。
  - 例えば AdoptOpenJDK の場合、GitHub上でリリースを出しているが特にリリースノートなどは用意していない。
  - https://github.com/AdoptOpenJDK/openjdk8-binaries/releases

## 有償LTSとなった後のJava8

~~良く理解できていないのが、Oracle側が有償LTS化した後のOpenJDK側のJava8のソースコードの扱い。~~

- https://openjdk.java.net/projects/jdk8u/ としてjdk8のupdateプロジェクト自体は継続しているのだが、ここで、Oracleの有償LTSのJava8アップデート・リリースの内容がバックポートされるのだろうか？
- Oracleとしては有償化した以上、それをOpenJDKにわざわざバックポートするのだろうか？
- 他のLTSベンダとしても、特に有償LTSを提供しているところなどは、独自の修正を行う可能性がある。とはいえ、OpenJDKベースであればGPLということもあり、有償LTS向けのパッチがOpenJDK側にバックポートされることを期待できる（が、確実にそうなるという確証も無い）。

~~つまりJava8については、今後は Oracle版有償LTS化されたJava8 と、OpenJDKベースで各LTSベンダからのパッチが取り込まれていくJava8に分裂するのではないか？という疑問が拭えない。(誰か知ってる人いたらおしえてください)~~

→ @yamadamn さんからのコメントにある[Introduction to Java 11: Support and JVM Features #jjug](https://www.slideshare.net/YujiKubota/introduction-to-java-11-support-and-jvm-features/5) を見てみると、方向性としてはコミュニティによる管理に移行する流れらしい。開発リードとしては「[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit) / [Javaは今も無償です](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)」の「OpenJDKのアップデートプラン」に書かれているが、RedHatが主導する可能性が高い。以下日本語訳より引用：
> 2019年1月に、オラクルがOpenJDK 8のアップデートを停止したあと、レッドハットがOpenJDK 8のリーダに志願する意向です。重要なことですが、レッドハットはOpenJDK 6と7のプロジェクトを主導していますが、彼らが唯一のコントリビュータではないということに注意してください。他のベンダも時々パッチや修正を提供しています。OpenJDK 8では、レッドハット関連企業ではないところ、たとえばアマゾンやAzul、IBMなどからかつてないほどのコントリビュートがあるでしょう。

よって分裂に対する不安感は大分低減される。実際、OpenJDKベースであればライセンスがGPLv2である以上、各ベンダそれぞれで修正したパッチについては公開(厳密にはそのバイナリを入手できる人に対してだが、無償LTS版の公開DLを提供するのであれば事実上全世界に公開)することになるので、OpenJDK側にバックポートされる期待値は高い。

## Javaに対する安心と新しい不安

Javaが有償化する、という不安は大分収まったと感じる。やはり各LTSベンダが積極的にJava無償化と、一部ベンダではJava8の無償LTS化を宣伝した効果ではないだろうか。
~~一方で、LTSがベンダごとに分裂してしまうのではないか？という新しい不安を感じる。~~
~~いくらOpenJDKという同じコードからビルドしているとはいえ、Oracleが有償サポートで四半期ごとにアップデート・リリースをするJava8と、RedHatLinux/Azul Systems/AdoptOpenJDK/IBM/AWS Correto のJava8は「同じ」と言えるのだろうか？~~
~~もちろんTCKで互換テストはパスしているのだろうが、JVM起動の "-XX" オプションまで本当に同一なのか？~~
~~Oracle側のドキュメントに記載されている機能は、本当に全てが他のJava8 LTSリリースでも使えるのだろうか？~~
~~Oracle側の有償LTSで修正されたJava8のバグは、OpenJDKに反映されて、他のベンダのLTSにも取り込まれるのだろうか？~~
~~そもそもOracle側の有償LTSで修正された内容は、今までどおりOracle CPUやOracleのJava SEのページに書かれるのだろうか？~~
~~(このあたり、自分の資料調査不足もあると思うので、良いポインタ資料知ってる人いたら教えてほしい・・・。)~~

~~そのあたりが全く見通しがつかない。TCKパスしてればまず大丈夫だろうとは思うけど、油断できないと考えてる。~~
~~あるベンダのJava8 LTSで使えた "-XX" オプションが、別のベンダのJava8 LTSでは使えないとか無いよね・・・？~~
~~（そもそも "-XX" オプション使うときにそれが特定ベンダの特定LTS固有のものかどうかちゃんと調べておけよ、という話ではあるけど）~~

→ @yamadamn さんコメント中の資料などから、確かに微妙に異なる可能性はあるが、 **それは以前からもそうだった** 。「[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit) / [Javaは今も無償です](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)」の「新しい6ヶ月リリースサイクルとLTS」にある「Java / OpenJDKでのLTSは何を意味するのか？」の中でさらっと触れられており、日本語訳より引用：
> 注記: このことは、OracleのJDKが、他プロバイダが作成するOpenJDKベースのバイナリと異なる可能性があるということを意味します (これは今までもつねにそうでした)。これは、バイナリがTCKをパスする限り、そうしたバイナリもTCKをパスしているのであれば、Java SE標準との互換性がありますので、安心してお使いください。

つまりTCKをパスしたものであれば「標準」には互換性がある、ただし独自のオプションなど「標準ではないもの」については互換性が無いよ、それは今までもそうだった、ということで、確かにその通りで、そのための「標準」でありTCKがあるのだろう。

例えばJava7 については無償サポート終了後もOracle CPU でアップデートが続けられている。

- 無償サポート範囲のOracle側リリースノートは 1.7.0_80 までで終わっている。
  - https://www.oracle.com/technetwork/java/javase/7u-relnotes-515228.html
- 有償サポート範囲のOracle側リリースノートがその後も続いていて、最新は2019-01-15 CPUリリースの 1.7.0_211-b07 となっている。
  - https://www.oracle.com/technetwork/java/javase/documentation/javase7supportreleasenotes-1601161.html

では上記リリースが OpenJDK7 側にも反映されているのか？については調べきれていない。
openjdk.net 側のJava7 updateプロジェクトのML(jdk7u-dev : https://mail.openjdk.java.net/pipermail/jdk7u-dev/ ) も軽く直近半年ほどあたってみたが、主にMLで動いているのはRedHatの人たちらしい。
Oracle側のCPUリリースの少しあとでOpenJDKのMLにも同じバージョンでのリリースアナウンスが流れてるので、多少動きは連動してると思われる。
~~ただ、もしかしたら一見連動しているように見えるだけで、RedHat側の都合が反映されているのかもしれず、このあたり、Oracle側とOpenJDK側の手綱のバランスがどうなっているか正直外からはすぐにわからない。~~
~~また、Java8がどうなるかについてもやはり見通しがつかない。~~

→ @yamadamn さんコメント中の資料「[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit) / [Javaは今も無償です](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)」の「OpenJDKのアップデートプラン」にあるとおり、OpenJDK8側のコードベースについては2019年1月から先はRedHatがリードする方向となっている。Java7についても、MLでの動きの通り、RedHatがメンテナンスを引き継いでいる。
また「[Introduction to Java 11: Support and JVM Features #jjug](https://www.slideshare.net/YujiKubota/introduction-to-java-11-support-and-jvm-features/13)」にもあるが、Oracle側のリリース後、他のベンダー側では1-2週間ほど遅れてリリースされる場合もあるとのこと。
つまり大枠としては以下のようになると思われる。

1. 2019年1月以降は、OpenJDK8のメンテナンスはコミュニティに引き継がれ、おそらくRedHatがリードする。
2. OpenJDK8自体はGPLv2なので、各LTSベンダごとの修正パッチは最終的にOpenJDK8にバックポートされる可能性が高い。よって、OpenJDK8のLTS版が「分裂」する危険性は低い。
3. ただし分裂の危険性というのはあくまでも「標準」部分に関するものであり、それ以外の独自 "-XX" オプションなどについては、(今までもそうだったが)「非標準」な領域についてはベンダごとの差異はある。(「標準」が分裂することは無いが、それ以外の「非標準」な領域については分裂・・・というよりは単純に「差異」として存在するだろう、ということ。）

~~今の所、Javaリリースサイクルの変更の説明と有償化に対する誤解を解くためのLTSベンダによる宣伝が入り乱れており、「じゃぁ、実際にLTSになった後どうなるの？」という話が見えない。~~
~~Oracleからの資料はあくまでもOracleとOpenJDKの話しか書かれておらず、他のLTSベンダとの関連についてはわからない。~~

→ @yamadamn さんコメント中の資料「[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit) / [Javaは今も無償です](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)」が総合的に、LTS後の動向や、他のLTSベンダとの関わりについても解説されているので、これを参照するのがおすすめ。

肝心の「リリースノート」についてだが、おそらく厳密にリリース内容を調査するのであれば、当然ながらOracle含めた各LTSベンダの有償サポートを契約するのが確実なのだろう。
無償の範囲でどこまで情報が取れるのか、そこはまだ不明。（必要なのは読める文章・サマリとしてのリリースノートなので、単にバイナリがDLだけでは不満。で、そうしたリリースノートとしてはどこを見ればよいのか？）

2019年は、そのあたりの動向を見定める一年となりそう。

最後にぶっちゃけるなら、非標準の "-XX" オプションやアップデート・リリースで増えたり減ったりする セキュリティ or システムプロパティやトラブル時の解析技法についてLTSベンダ間の互換性がどうのこうのとそこまで気にする用途だったら素直に有償LTS契約しろよという話で、それが無理なら、そうした細かい変更に影響受けないように自動テスト整備してリグレッションテスト回せるようにした上でそうしたJVMの細かい修正に影響されないように全体設計しろよ、という話でそれ自体は全くの正論なんですが現実（予算）を前にすると無償LTSベンダにひれ伏すしかないので無力。

あと、セキュリティ系にうるさいところでJava使っていると、やっぱりJavaアップデートが公開されたら自分たちのシステムに影響出ないか調べるじゃないですか、そうしたときに何かしらリリースノートが出てるとやっぱり違うなって。OpenJDK のMLを見てても、細かいマージやバグ修正の動きは見えるのですが、最終的にリリースされたときに変更点一覧としてわかりやすいサマリが流れてくるわけでもないので、そうした点からもやっぱりどこかで修正サマリとして見れるリリースノートが無いとつらたん。

## 参考

- Java Is Still Free
  - https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit
- Javaは今も無償です
  - https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit

Oracle側：

- JDK 新しいリリースモデル解説 (ver. 2.2)
  - https://www.slideshare.net/oracle4engineer/jdk-ver-22
- JDKの新しいリリース・モデル、および提供ライセンスについて
  - https://www.oracle.com/technetwork/jp/articles/java/ja-topics/jdk-release-model-4487660-ja.html
- Oracle Java SE サポート･ロードマップ
  - https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html
- Critical Patch Updates and Security Alerts
  - https://www.oracle.com/technetwork/topics/security/alerts-086861.html
- Java SE - Downloads | Oracle Technology Network | Oracle
  - https://www.oracle.com/technetwork/java/javase/downloads/index.html

OpenJDK:

- https://openjdk.java.net/
  - ここはOpenJDKの開発プロジェクト全般がまとめられている。OpenJDKのダウンロードやリリースノートについては、↓を参照したほうが良い。
- https://jdk.java.net/

ただ、なんとなく java.net のサイト全体が見づらい。歴史的な事情もあるし、Oracle側にある内容など重複するしいろいろ事情はあるのだろうけど・・・。

主なOpenJDKバイナリベンダ:

- AdoptOpenJDK
  - https://adoptopenjdk.net/
- Azul Systems (Zulu Enterprise)
  - https://www.azul.com/
- IBM Knowledge Center - IBM SDK Java Technology Edition
  - https://www.ibm.com/support/knowledgecenter/ja/SSYKE2/welcome_javasdk_family.html
  - https://www.ibm.com/blogs/solutions/jp-ja/itmedia-article-websphere/
- RedHat
  - OpenJDK ライフサイクルおよびサポートポリシー
     - https://access.redhat.com/ja/articles/1457743
  - Windowsバイナリ
     - https://developers.redhat.com/products/openjdk/overview/

その他:

- Java 10以降のJava: リリースサイクルの変更とOpenJDKへの統合- JfokusでのMark Reinhold氏のセッションから - Fight the Future
  - https://www.sakatakoichi.com/entry/2018/02/09/Java_10%E4%BB%A5%E9%99%8D%E3%81%AEJava%3A_%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%81%AE%E5%A4%89%E6%9B%B4%E3%81%A8OpenJDK%E3%81%B8%E3%81%AE%E7%B5%B1%E5%90%88-_Jfokus
- Javaのリリースは6ヶ月ごととなる
  - https://www.infoq.com/jp/news/2017/09/Java6Month
- Introduction to Java 11: Support and JVM Features #jjug
  - https://www.slideshare.net/YujiKubota/introduction-to-java-11-support-and-jvm-features