JDKに関するQ&A

この2ヶ月位で調べたことまとめ。
できるだけソースを出していますが、すぐに事情が変わると思います（私が調べている間もそうだったので）。
随時更新するつもりですが、間違いなどございましたらご容赦ください。

# Javaを取り巻く状況について
## 何が起こったの？　なんで皆騒いでるの？

- Oracleが提供するJavaのメジャーバージョンアップデートの[ロードマップが変わった](https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html)
- OracleJDKが[Java 11からOTNライセンスとなり、商用向けには完全有料化](https://faq.oracle.co.jp/app/answers/detail/a_id/4929)することを発表した

> JDKは今後、オラクルが有償で提供していた機能も含めて全てが無償化され、6カ月に1回のサイクルでバージョンアップされます。ただし、ユーザーの中には、「ベンダーのサポートを受けながらJavaを利用したい」といったニーズや、さまざまな事情から「利用しているJDKを特定バージョンで固定したい」といったニーズが存在します。これらのニーズに応えるために、JDK 8およびそれ以前のリリースと同じようにJDK 11よりLTS指定のフィーチャー・リリースに対して公式OpenJDKバイナリのアップデート終了後も有償サポートを提供します。
> - [JDKの新しいリリース・モデルおよび提供ライセンスについて](https://www.oracle.com/technetwork/jp/articles/java/ja-topics/jdk-release-model-4487660-ja.html)

<!-- -->

> OTNライセンスに基づき提供されるソフトウェアは本番環境で使用いただけません。
> - [正規ライセンスを取得していれば、OTNソフトウエアを本番環境で使用可能ですか？](https://faq.oracle.co.jp/app/answers/detail/a_id/4931)

## それで、何が困っているの？　自分も何かしないといけない？

以下のいずれかに該当するなら対策が必要。

- 本番環境でOracleJDKを利用している
- OracleのJava 8を現在使っていて、これからもセキュリティアップデートが必要
    - Java 9とか10とかにアップデートした人はもう全部解ってますよね？　という読者フィルタ

### いつまでに？

Java 8の無償セキュリティアップデートは商用利用ユーザーの場合2019年1月まで。
個人利用の場合は2020年12月まで。

[Oracle Java SE サポート・ロードマップ](https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html)

### 何をすれば良い？

以下の選択肢から選ぶ。

1. Oracle Java 8をそのまま使い続ける。セキュリティアップデートは諦める
2. Oracleにライセンス料を払ってJava 8のセキュリティアップデートを延命させる  
（Java 8のサポートが2022年3月まで延びる）
3. Oracleにライセンス料を払ってJava 11 LTSを使うようにする
4. Oracle以外のJDKに乗り換える  
8のサポートがまだ切れないものか、無償で商用利用できる11

お金がある（が十分な人的リソースが無い）なら2.の有償サポートを受けつつ開発コストを割いて3.に移行すれば良い。
人的リソースはあるがお金が無い場合はJDKを乗り換える4.のパターンになる。

# よくありそうな疑問

## 「[Javaは今も無償です](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing)」とかあるけど、結局どっちが正しいの？

**Javaは今も無償です。** 但し以下の条件がある。

- 非商用ユーザーである
- 商用ユーザーだが
    - 本番環境以外での利用である（開発・テストなど）
    - OracleJDK 11などの有償ライセンスのJDK *以外* のものを使っている

## 何も心配要らないとか、アップデート追随できなければ終わってるとか言われてるけど？

理想と現実は違う。
そこで語られているのは理想であって、あなたのプロダクトが（潰れても）大丈夫かどうかという話ではない。

実際、JVM言語や関連ライブラリそのものがアップデートに追随できていない現状では、アップデート支援への参加やプロダクトのフルリプレイスなど、かなりコストの高い（実質的に不可能な）選択肢を求められているところもあると思う。

## 有償になるならOracleから他のJDKに乗り換えたいんだけど、おすすめは？

プロダクトの状況によるので参考情報。

- 6ヶ月に1回のアップデートに追随できるなら、Oracleが提供する[OpenJDK](http://jdk.java.net/)が、今後機能的にもOracleと違いがなくなるので良さそう
    - 機能の差がなくなるのはバージョン11から
- 無償のLTSが欲しい場合は以下などの選択肢があるが、無償ゆえにベストエフォートの場合があることは承知の上で利用されたい
    - [Amazon Corretto](https://aws.amazon.com/jp/blogs/opensource/amazon-corretto-no-cost-distribution-openjdk-long-term-support/)
    - [AdoptOpenJDK](https://adoptopenjdk.net/)
    - [Red Hat](https://access.redhat.com/ja/articles/1457743)（Red Hat Enterprise Linuxでの利用に限る）
    - [Azul](https://jp.azul.com/products/azul_support_roadmap/)（[AzureまたはAzure Stack上での利用では無償](https://azure.microsoft.com/ja-jp/blog/microsoft-and-azul-systems-bring-free-java-lts-support-to-azure/)、それ以外は有償）
    - [IBM](https://developer.ibm.com/javasdk/support/lifecycle/)（自社製品バンドルっぽい？　未確認）

有償でも場合によってはOracleより安いかもしれないので試算をおすすめする。

## とりあえずJavaを8からアップデートしたい。注意点は？

Java 9と10のサポート期限はとうに切れているので、アップデートするなら11になる。
各バージョンごとの差分は他の記事を参照されたい。
（私も作ったのだが公開できる状況ではない）

## この際有償でも良いので、Java 8のサポート期限を延ばして時間を稼ぎたい

Oracleの課金形態はこの数ヶ月でコロコロと変わっていたらしい。
公式の[製品価格表（PDF）](https://www.oracle.com/assets/e-pl101005-101005a-n-176288-ja.pdf)にはまだ買い切りの値段が載っていたりするが、現状では **Subscription形式の課金システムに一本化されている** ので注意されたい。

> Java SE Advanced、Java SE Advanced Desktop、Java SE Suiteの各製品は、より柔軟にご利用いただけるJava SE Subscriptionサービスに移行しました。
> - [Oracle Java SE Subscription](https://www.oracle.com/jp/java/java-se-subscription.html)

本番環境で使う場合は、プロセッサごとに課金される料金設定になっている（年単位契約）。

なお、利用できるクラウドに制限もあるので、GCPなどを利用している場合はOracleに問い合わせてほしい。
[クラウド・コンピューティング環境における Oracle ソフトウェアのライセンス（PDF）](https://www.oracle.com/assets/cloud-lic-170290-ja.pdf)

## ScalaのJava 11対応マダー？

マダー
https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html

状況についてはこのissueを参照。
https://github.com/scala/community-builds/issues/796
コンパイルが通っていないライブラリがまだある。Sparkとか。

---

社外に出せる情報は以上だ！