参考メモ/CentOS7 の OpenJDK パッケージの構成メモ

お仕事ではOracleがリリースしてるJava SEを使うんですが、Red HatやCentOSで提供されてるOpenJDKのパッケージ構成ってどうなってるんだろう？と思って、CentOS7でちょっと見てみたので、簡単にメモしておきます。

## CentOS7 で使えるOpenJDKパッケージ一覧

```
環境：64bit CentOS7
$ cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
※epelリポジトリ導入済み
```

`yum search java` から適当にsortして抜き出した一覧：

```
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment

java-1.7.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-headless.x86_64 : The OpenJDK runtime environment without
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment

java-1.8.0-openjdk-accessibility-debug.x86_64 : OpenJDK accessibility connector
java-1.8.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.8.0-openjdk-demo-debug.x86_64 : OpenJDK Demos with full debug on
java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.8.0-openjdk-devel-debug.x86_64 : OpenJDK Development Environment with
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.8.0-openjdk-headless-debug.x86_64 : OpenJDK Runtime Environment with full
java-1.8.0-openjdk-headless.x86_64 : OpenJDK Runtime Environment
java-1.8.0-openjdk-javadoc-debug.noarch : OpenJDK API Documentation for packages
java-1.8.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.8.0-openjdk-src-debug.x86_64 : OpenJDK Source Bundle for packages with
java-1.8.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.8.0-openjdk-debug.x86_64 : OpenJDK Runtime Environment with full debug on
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
```

感想：

- OpenJDK 6, 7, 8 とパッケージが用意されてて、用途によって分かれてる。
- OpenJDK 8 になると、`-debug` あり・なしでさらに分かれてる。

## インストールと、各パッケージの簡単な調査メモ

```
$ sudo yum install \
  java-1.8.0-openjdk \
  java-1.8.0-openjdk-javadoc \
  java-1.8.0-openjdk-src \
  java-1.8.0-openjdk-headless \
  java-1.8.0-openjdk-devel \
  java-1.8.0-openjdk-demo \
  java-1.8.0-openjdk-accessibility

...
Installing:
 java-1.8.0-openjdk                 x86_64
 java-1.8.0-openjdk-accessibility   x86_64
 java-1.8.0-openjdk-demo            x86_64
 java-1.8.0-openjdk-devel           x86_64
 java-1.8.0-openjdk-headless        x86_64
 java-1.8.0-openjdk-javadoc         noarch
 java-1.8.0-openjdk-src             x86_64
Installing for dependencies:
 giflib                             x86_64
 java-atk-wrapper                   x86_64
 javapackages-tools                 noarch
 lksctp-tools                       x86_64
 python-javapackages                noarch
 python-lxml                        x86_64
 ttmkfdir                           x86_64
 tzdata-java                        noarch
 xorg-x11-font-utils                x86_64
 xorg-x11-fonts-Type1               noarch
```

以下、各パッケージについて `rpm -qilR --scripts パッケージ名` した結果から内容について簡単にメモ。

### java-1.8.0-openjdk

- OpenJDKの実行環境を入れるためのパッケージだが、このパッケージ自身は policytool とAWTやサウンド系のsoファイル、あとはデスクトップ環境用の設定・アイコンファイルしか入っていない。
- 依存関係で `java-1.8.0-openjdk-headless` を必要としており、後述の通りこちらがJava VM本体。

ファイルリスト：

```
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/amd64/libawt_xawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/amd64/libjawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/amd64/libjsoundalsa.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/amd64/libsplashscreen.so
/usr/share/applications/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64-policytool.desktop
/usr/share/icons/hicolor/16x16/apps/java-1.8.0.png
/usr/share/icons/hicolor/24x24/apps/java-1.8.0.png
/usr/share/icons/hicolor/32x32/apps/java-1.8.0.png
/usr/share/icons/hicolor/48x48/apps/java-1.8.0.png
```

### java-1.8.0-openjdk-headless

- `$JAVA_HOME/jre/(bin|lib)/` 以下のファイルを提供する、Java実行環境の本体パッケージ。
- `rpm -q --scripts` で見てみると、alternativesコマンドなど、結構複雑なことしてる。
- `jpackage-utils` や `tzdata-java` パッケージに依存してる。

主なファイルリスト：

- `/usr/lib/jvm-exports/` 以下のディレクトリとjarファイル
- `/usr/lib/jvm-private/` 以下のディレクトリとjarファイル
- `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/bin` 以下の実行ファイル
- `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib` 以下のライブラリや設定ファイル
- manページ

### java-1.8.0-openjdk-devel

- javacなどJavaで開発するためのコマンドやライブラリ・ヘッダーファイル。

主なファイルリスト：

- `/usr/lib/jvm-exports/` 以下のディレクトリとjarファイル
- `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/(bin|include|lib)` 以下の実行ファイル・ライブラリ・ヘッダーファイル
- manページ
- stap用ファイル


### java-1.8.0-openjdk-javadoc

- Java8 の JavaDoc。英語。ネットが使えるならOracle公式の日本語ドキュメント見れば良いので、入れなくても良い。
- Oracleの日本語ドキュメント：
 - https://docs.oracle.com/javase/jp/8/
 - https://docs.oracle.com/javase/jp/8/docs/api/

ファイルリスト：

```
/usr/share/doc/java-1.8.0-openjdk-javadoc-1.8.0.71
/usr/share/doc/java-1.8.0-openjdk-javadoc-1.8.0.71/LICENSE
/usr/share/javadoc/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2
...
```

### java-1.8.0-openjdk-accessibility

- JavaのAWTアプリケーションでアクセシビリティサポートを追加する。AWTアプリでアクセシビリティ気にしなければ入れなくて良い。
- 依存関係で `java-atk-wrapper` を必要としている。

ファイルリスト：
```
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/accessibility.properties
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/amd64/libatk-wrapper.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/ext/java-atk-wrapper.jar
```

### java-1.8.0-openjdk-demo

- Javaのデモ・サンプルコードなど。

ファイルリストは省略

### java-1.8.0-openjdk-src

- Java クラスライブラリのソースコード。

ファイルリスト：

```
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/src.zip
/usr/share/doc/java-1.8.0-openjdk-src-1.8.0.71
/usr/share/doc/java-1.8.0-openjdk-src-1.8.0.71/README.src
```

### その他の依存パッケージについて

`java-1.8.0-openjdk-xxx` パッケージをインストールすると、依存関係で一緒に入ってくるパッケージの中でも、特にJavaに強く関連するものについて簡単にメモ。

- javapackages-tools
 - Javaのパッケージングに使うスクリプトやマクロを提供
- python-javapackages
 - Javaのパッケージングで使うPythonライブラリ
- tzdata-java
 - Javaランタイム用のタイムゾーン情報ファイル。
 - `/usr/share/javazi/` ディレクトリ以下にタイムゾーン情報がファイルで保存される。

## まとめ : ざっくりとしたディレクトリ・ファイル構成

- Java本体系：
  - `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64`
     - `JAVA_HOME` 相当, JDK/JREの実行ファイル・ライブラリなど。
  - `/usr/lib/jvm-(common|exports|private)/`
     - 関連ライブラリのjar 
- `alternatives` 関係
  - 異なるメジャーバージョンを同時に入れた場合、`alternatives` コマンドで `/usr/bin` 以下のコマンドなどをシンボリックリンクで切り替え、デフォルトで使用するバージョンを設定できるように構成されてます。
  - `/etc/alternatives/`
     - java, jar, javac, jstat など主要コマンドや jre, java_sdk など主要ディレクトリがシンボリックリンクで管理されてる。
- javapackages-toolsパッケージ系
  - なぜか `/etc/java` というそれっぽいディレクトリ作って、 `java.conf` など置いている。

## おまけ : Red Hat によるOpenJDK / OracleによるJava SEのサポートライフサイクル

そもそものOpenJDK/Oracle Java SEの違いについて、2015年の新し目のわかりやすい解説資料：

- [OpenJDKは使い物になるか？OpenJDKの実際と今後 （NTTデータ オープンソースDAY 2015 Autumn 講演資料）](http://www.slideshare.net/hadoopxnttdata/openjdk-nttdata-oss-day-2015-autumn)
 - http://www.slideshare.net/hadoopxnttdata/openjdk-nttdata-oss-day-2015-autumn

Red Hat によるOpenJDKのサポートライフサイクル:

- [Red Hat Enterprise Linux のサポートポリシーについてよく利用されるナレッジ - Red Hat Customer Portal](https://access.redhat.com/ja/node/1520083)
 - https://access.redhat.com/ja/node/1520083
- →
- [OpenJDK Life Cycle and Support Policy - Red Hat Customer Portal](https://access.redhat.com/articles/1299013)
 - https://access.redhat.com/articles/1299013
 - End of Production Support は、OpenJDK 8 が ~~2020年10月~~ 2023年6月 [^1]までとなってる。Oracleの無償サポート期間より長い。

Oracle によるJava SEのサポートライフサイクル

- [Oracle Java SE サポート･ロードマップ](http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html)
 - http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html
 - Java 8は 2014年3月に利用開始で、Java 9が未定のうちは、2017年9月に公式サポート終了。
 - Oracle Java SEサービスに移行すれば延長できるっぽい。

ちなみに、Red Hat でもOracle Java SEをパッケージングしたリポジトリを用意してるらしく、多分RHNなど有償サブスクリプション系に入れば、使えるのかな？

- [Where are Oracle/Sun/IBM Java packages located? - Red Hat Customer Portal](https://access.redhat.com/solutions/732883)
 - https://access.redhat.com/solutions/732883

[^1]: 2018-10-03 : 指摘により再確認して最新の情報に更新