OpenJDKのキャッチアップのメモ

# 概要

2018年9月にリリース予定のOpenJDK 11に備えて、OpenJDKについてキャッチアップした結果のメモです。

# OpenJDKについて

**参考**

* [OpenJDK ライフサイクルおよびサポートポリシー] (https://access.redhat.com/ja/articles/1457743)
* [OpenJDK 参加入門 [JJUG CCC 2017 Fall E2]] (https://www.slideshare.net/DavidBuck7/openjdk-project-crash-course-japanese)
* [JDK: 新しいリリースモデル解説（ver.2.0）] (https://www.slideshare.net/oracle4engineer/jdk-ver20)

## ライセンス

[GNU General Public License, version 2, with the Classpath Exception] (http://openjdk.java.net/legal/gplv2+ce.html)

GPLリンク例外を持つGNU General Public License (GNU GPL 2および2+) 

> [OpenJDK FAQ] (http://openjdk.java.net/faq/)
> 
> **Licensing**
> What open-source license is OpenJDK published under?
> 
GPL v2 for almost all of the virtual machine, and GPL v2 + the Classpath exception for the class libraries and those parts of the virtual machine that expose public APIs.

## バイナリの配布

Oracleがビルドしたバイナリが[JDK Builds from Oracle] (http://jdk.java.net/)からダウンロードできます。

## アーカイブの配布

[Archived OpenJDK GA Releases] (http://jdk.java.net/archive/)から入手できます。

## ソースコード

ソースコードは[Mercurial] (https://www.mercurial-scm.org/)という分散型VCSで管理され、[OpenJDK Mercurial Repositories] (http://hg.openjdk.java.net/)にホスティングされています。
なお、OpenJDKをインストールしたディレクトリ直下のlibディレクトリにsrc.zipが同梱されていますが完全なソースコードを含んでいません。

## バグ管理

[JDK BUG System (JBS)] (https://bugs.openjdk.java.net/secure/Dashboard.jspa)、および[OpenJDK Wiki] (https://wiki.openjdk.java.net/dashboard.action)で管理されています。

## コードベースでOpenJDKとOracle JDKに違いがあるか

下記に引用するOpenJDKのFAQでは、Oracle JDKはOpenJDKのソースコードをベースにしていると説明されています。

> [OpenJDK FAQ] (http://openjdk.java.net/faq/)
> 
> **Oracle JDK and OpenJDK**
> Is Oracle JDK based on OpenJDK?
> 
> Yes. Oracle JDK is based on the OpenJDK source code. In addition, it contains closed-source components. The final result is licensed under a Binary Code License.

他にOracleの公式情報を探したのですが見つからなかったので、代わりにStackOverflowの「[Differences between Oracle JDK and OpenJDK] (https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk)」に付いた回答の一部を下記に引用します。

> Both OpenJDK and Oracle JDK are created and maintained currently by Oracle only.

## API JavaDoc

バイナリのダウンロードページにリンクがありますが、リンク先はOracleのサイトになっています。
JDK 11 Early-Access Builds版も用意されています。（GA版も閲覧できるかどうかは確認していません。）

* [JDK 10.0.1 General-Availability Release] (https://docs.oracle.com/javase/10/docs/api/overview-summary.html)
    * Java® Platform, Standard Edition & Java Development Kit Version 10 API Specification
* [JDK 11 Early-Access Builds] (https://download.java.net/java/early_access/jdk11/docs/api/)
    * Java® Platform, Standard Edition & Java Development Kit Version 11 API Specification

## Community Code Review

ソースコードだけでなくAPIドキュメントの変更についてもレビューが行われています。

* [Java SE 11 (18.9) ( JSR 384) Specification — DRAFT 1] (http://cr.openjdk.java.net/~iris/se/11/spec/java-se-11-draft-spec-01/)
    * 2018/5/23 11:58 -0700
* [Java SE 11 (18.9) ( JSR 384) Specification — DRAFT 2] (http://cr.openjdk.java.net/~iris/se/11/spec/java-se-11-draft-spec-02/)
    * 2018/6/8 12:12-0700
* [Java SE 11 (18.9) ( JSR 384) Specification — DRAFT 3] (http://cr.openjdk.java.net/~iris/se/11/spec/java-se-11-draft-spec-03/)
    * 2018/6/25 00:18 -0700

Draft2 AnnexesのA2 API Specification differencesで「Java SE 10 (build 45)」と「Java SE 11 (build 17)」のAPIの差分が確認できます。

## Docker OFFICIAL REPOSITORY

https://hub.docker.com/r/library/openjdk/


# AdoptOpenJDKについて

AdoptOpenJDK Communityが提供するOSSのJDKです。コミュニテーのTier-1スポンサーに、IBM、London Java Community (LJC)、Microsoft Azure、Packetがあります(2018年8月現在)。

正直なところ、今回のOracle JDKの有償化を受けて初めてAdoptOpenJDKを知りましたが、今後、Oracle JDK以外を選択する場合は、OpenJDKよりAdoptOpenJDKを推奨される方が結構いるような印象を受けました。

## ライセンス

[GPL v2 with Classpath Exception] (http://openjdk.java.net/legal/gplv2+ce.html)

* [About AdoptOpenJDK - GetOpenJDK] (https://adoptopenjdk.net/about.html)

> OpenJDK code itself is licensed under GPL v2 with Classpath Exception.

## バイナリの配布

[Latest release | AdoptOpenJDK] (https://adoptopenjdk.net/releases.html)から入手できます。

## アーカイブの配布

[Archive | AdoptOpenJDK] (https://adoptopenjdk.net/archive.html)から入手できます。

## バグ管理

AdoptOpenJDK自体のバグ管理は行われていないようですが、build scriptに関する問題はGitHubのIssueで管理されています。

https://github.com/AdoptOpenJDK/openjdk-build

## Docker OFFICIAL REPOSITORY

[adoptopenjdk AdoptOpenJDK Community Project] (https://hub.docker.com/u/adoptopenjdk/)



# Oracle JDKについて

**参考**

* [Oracle Java SEサポート・ロードマップ] (http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html)
    * TBA = To be announced (後日発表)
* [日本オラクルが今後のJavaのリリースモデルと公式バイナリについてあらためてJava Day Tokyoで説明。オラクルによる公式バイナリの無償提供はOpenJDKベース - Publickey] (https://www.publickey1.jp/blog/18/javajava_day_tokyoopenjdk.html)

## ライセンス

Binary Code License (BCL)

* [Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX] (http://www.oracle.com/technetwork/java/javase/terms/license/index.html)
* [Java SEプラットフォーム製品及びJavaFXに関するオラクル・バイナリ・コード・ライセンス契約　【日本語参考訳】] (http://www.oracle.com/technetwork/jp/licenses/javase-dev-license-2595998-ja.html)

## Oracleが配布するJDKのバイナリ

[JDK Builds from Oracle] (http://jdk.java.net/)よりOracleがビルドしたバイナリをダウンロードできます。
2018年6月17日時点で、JDK 10とJDK 11 Early-Access Buildsがダウンロードできます。

JDK 11以降もOracleがビルドしたバイナリが提供されますが、無償配布はOpenJDKをビルドしたバイナリで、Oracle JDKは有償契約のユーザーにのみ配布されます。

Oracle JDKは、JDK 11以降は3年ごとにメジャーバージョンがリリースされます。なのでOracle JDK 11 (2018年9月)の次は、Oracle JDK 17 (2021年9月)の予定です。

OpenJDKは、JDK 11以降は6カ月ごとに12,13,14とマイナーバージョンがリリースされます。こちらはLTSはないようなのでJDK 11でも次のバージョンのJDK 12がリリースされればサポート終了となります。
（OpenJDKにもLTSが導入される可能性があるというニュースもありますがまだ確定ではないようです。）

### JDK 11 Early-Access Builds

図のように無償提供のOpenJDK buildsと、GAより有償提供となるOracle JDK buildsの両方がダウンロードできます。(ダウンロードするには、Early Adopter Development License Agreement (アーリーアダプター開発ライセンス契約)に同意する必要があります)

契約内容に一部、太字で強調されている箇所があったので下記に引用します。
意訳すると

1) 本プログラムはGAではなく、欠陥、セキュリティ脆弱性があっても修正しないことがある。
2) 本プログラムをリリース目的のプロダクト開発に使用できない。

> [Oracle Technology Network Early Adopter Development License Agreement] (http://www.oracle.com/technetwork/licenses/ea-license-noexhibits-1938914.html)
> 
> You acknowledge that (1) the Programs are not generally available and may have defects, security vulnerabilities, or other deficiencies that may not and/or cannot be corrected by Us and are subject to change at Our sole discretion; and (2) We may not produce a production release version of the Programs and any development efforts undertaken by You are at Your own risk. We may audit Your use of the Oracle Technology.

![jdk11_0.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9588999b-3496-d3a9-836c-9ef16e41cc7a.png)

#### OpenJDK builds

ダウンロードファイル: openjdk-11-ea+18_windows-x64_bin.zip

Windows/x64版はzip形式のアーカイブファイルで提供されるようになっています。（以前はtar.gz)
下記のようにバージョン情報には"openjdk"と出力されます。

```text
> java -version
openjdk version "11-ea" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11-ea+18)
OpenJDK 64-Bit Server VM 18.9 (build 11-ea+18, mixed mode)
```

ちなみにOpenJDK 10のバージョン情報

```text
> java -version
openjdk version "10.0.1" 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10)
OpenJDK 64-Bit Server VM (build 10.0.1+10, mixed mode)
```

#### Oracle JDK builds

ダウンロードファイル: jdk-11-ea+18_windows-x64_bin.exe

Oracle JDK 10までと同様にexe形式のインストーラーで提供されています。

```text
> java -version
java version "11-ea" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11-ea+18)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11-ea+18, mixed mode)
```

ちなみにOracle JDK 10のバージョン情報

```text
> java -version
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
```

## OTNのダウンロードページ

[Java SE - Downloads] (http://www.oracle.com/technetwork/java/javase/downloads/index.html)からダウンロードできるJDKはOracle JDK 10.xで最後になる予定です。
有償契約したユーザーに配布されるOracle JDK 11がどこから入手できるかは調べ切れていません。

コメントで教えて頂きましたところ、有償サポート契約を結ぶと、My Oracle Supportよりダウンロードできるようになるようです。（私自身、有償サポート契約を結んでいないので確認できていません）

My Oracle Supportを利用するにはOracle AccountにサポートIDを紐づける必要があります。
サポートIDは、サポート契約締結時に送られてくるWelcome Letterというメールに記載されているそうです。

* [サポート契約締結の際にもらえる「Welcome Letter」について教えてください。] (https://faq.oracle.co.jp/app/answers/detail/a_id/2830/related/1)
* [サポートID（旧CSI番号）とはなんですか。] (https://faq.oracle.co.jp/app/answers/detail/a_id/2842)
* [My Oracle Supportの使用方法を教えてください。] (https://faq.oracle.co.jp/app/answers/detail/a_id/2845/~/my-oracle-support%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82)


## アーカイブの配布

[Oracle Java Archive] (http://www.oracle.com/technetwork/jp/java/archive-139210.html)から入手できます。

## ソースコード

Oracle JDKのソースコードは公開されていません。
下記に引用した通り(JDK 8のものです)、Oracle JDKをインストールしたディレクトリ直下のlibディレクトリにあるsrc.zipには完全なソースコードは含まれておらず、これからJDKをビルドすることはできません。

> [JDK 8 README] (http://www.oracle.com/technetwork/java/javase/jdk-8-readme-2095712.html)
> 
> **Source Code**
> 
> (In src.zip) Java programming language source files for all classes that make up the Java core API (that is, sources files for the java.*, javax.* and some org.* packages, but not for com.sun.* packages). This source code is provided for informational purposes only, to help developers learn and use the Java programming language. These files do not include platform-specific implementation code and cannot be used to rebuild the class libraries. To extract these file, use any common zip utility. Or, you may use the Jar utility in the JDK's bin/ directory:
> 
> jar xvf src.zip 

ちなみにJDK 10のREADMEからはこの段落は無くなっていました。

## 有償サポート契約

[Q. Javaの有償サポート・サービスについて教えて下さい。] (https://faq.oracle.co.jp/app/answers/detail/a_id/2685)

このFAQを読む限り個人での契約はできないようです。

## [Oracle Java SE Subscriptions] (https://www.oracle.com/java/java-se-subscription.html)

* [A Quick Summary on the new Java SE Subscription] (https://blogs.oracle.com/java-platform-group/a-quick-summary-on-the-new-java-se-subscription)
* [Oracle Java SE Subscription FAQ] (http://www.oracle.com/technetwork/java/javaseproducts/overview/javasesubscriptionfaq-4891443.html)

2018年6月21日に発表がありました。

従来の”Java SE Advanced”、”Java SE Advanced Desktop”、”Java SE Suite”はJava SE Subscriptionsに移行し、商用のJava SEライセンス、サポートを希望する顧客は”Java SE Subscription”か”Java SE Desktop Subscription”を選択できます。



# 補足

## JDK API Diff Report Generator

[AdoptOpenJDK/jdk-api-diff - GitHub] (https://github.com/AdoptOpenJDK/jdk-api-diff)

Adopt OpenJDKが公開している指定する2つの異なるJDKのAPI差分をレポートしてくれるツールです。
OpenJDK 9とOpenJDK 10やOracle JDK 9とOpenJDK 9といった指定ができるそうです。

ローカルにチェックアウトしてREADMEの説明の通り実行してみました。
比較対象はOpenJDK 9.0.4とOpenJDK 10.0.1です。
処理が終了するとtargetディレクトリにjdk-api-diff.htmlというレポートが生成されます。

![r0.png](https://qiita-image-store.s3.amazonaws.com/0/22772/61cb1c87-c51c-5326-c46c-dff73cdf8b5e.png)

![r1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d6874aa4-ff17-fded-f085-f5366683c01b.png)

## Support Java 11

* [Support Java 11 in OpenLiberty] (https://github.com/OpenLiberty/open-liberty/issues/540)