AdoptOpenJDK 8をビルドしてみた（追記：Amazon Corretto 8も）

# きっかけ

## Oracleは2月以降にJava有償化(無償のJavaを出さない)

Oracleは2月以降は無償のJavaをリリースしません。
政府（内閣官房情報通信技術（ＩＴ）総合戦略室）からは、Oracleの有償のJavaを使うかOpenJDKを半年置きに更新していく、という方針が出されています。
https://cio.go.jp/sites/default/files/uploads/documents/technique_report_java.pdf

しかしながら、デベロッパーもシステム利用ユーザも

* Javaの変更にお金をかけたくない
* 半年置きに更新の手間はかけたくない（半年置きにコストになる）
* でもサポート切れのソフトウェアは使いたくない

と考えています。
（Javaを利用しない、アンインストールするデベロッパーやユーザも現れ始めました）

特にJava FXやJava Web Startを用いたリッチクライアントアプリケーションを保守しているデベロッパーや利用ユーザは、Java 11へのアップグレードはすぐには受け入れがたい状況です。

## AdoptOpenJDK / Amazon Correttoがある

* AdoptOpenJDK 8は最低でも2023年9月まで
  https://adoptopenjdk.net/index.html
* Amazon Corret 8(2018-11-14リリース)は最低でも2023年6月まで
  https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-8-ug/downloads-list.html

サポートがあります。
これらを使っていくのが得策ではないかと考えました。

## AdoptOpenJDK 8 / Amazon Corretto 8にはバグがある

と思い検証を進めていたら、OracleJDK 8では発生しませんが、AdoptOpenJDK 8 / Amazon Corretto 8では発生するバグを見つけてしまいました。
具体的には文字を回転しても、日本語の文字が回転されない不具合です。

*OracleJDK8の場合は正しく文字列が回転する*
![OracleJDK8.png](https://qiita-image-store.s3.amazonaws.com/0/8851/5995708b-63b5-9ff3-bea0-f0c69ed0ed93.png)

*AdoptOpenJDK8/Amazon Correttoの場合は日本語が回転せず体裁が崩れる*
![AdoptOpenJDK8.png](https://qiita-image-store.s3.amazonaws.com/0/8851/ede96cb2-e8fc-3f8e-4ba9-3c67c5c2338e.png)


## じゃあ直してみよう ##

実際に手を動かしてみました。
Linuxではサクッとできてしまい、WindowsではビルドにてこずったのでWindowsでのビルドについて記載します。

# 作業

## 準備

### Visual Studio Express 2013のインストール

https://visualstudio.microsoft.com/ja/vs/older-downloads/
からダウンロードします。

マイクロソフトの掲示板に直リンクのURLがありましたが、いつまでダウンロード可能かは不明です。
http://download.microsoft.com/download/E/F/2/EF21D164-8A66-4F08-B71F-26702B180E11/VS2013_RTM_DskExp_JPN.iso

ダウンロードしたらインストールしてください。
ほぼ選択肢はなく、素直にインストールすればよいです。

Visual Studio 2015以降はビルド準備スクリプト（generated-configure.sh）にて

* Microsoft Visual Studio 2015 - CURRENTLY NOT WORKING
* Microsoft Visual Studio 2017 - CURRENTLY NOT WORKING

とのことなので、Visual Studio 2013を選択してください。
Visual Studio 2013 Expressであれば、企業での利用も問題ありません。

### Cygwinのインストール

https://cygwin.com/install.html
から64bitのもの（setup-x86_64.exe）をダウンロードします。

ダウンロードしたら実行してセットアップします。
途中の「Choose Download Site」は日本のhttpサイトを選ぶと早く終わると思います。
追加すべきパッケージ以下のとおりです。

* Archive - unzip
* Archive - zip
* Devel - autoconf
* Devel - binutils
* Devel - git
* Devel - make
* Interpreters - m4
* System - procps-ng
* Utils - cpio

### JDK7のダウンロード

ビルドにはJDKも必要です。
一つ前のバージョンの安定したJDKを使うのが標準的とのことで、今回はOracleのJDK7をダウンロードしてインストールします。
https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

Pleiades等に同梱されているJDK7をコピーしてもよいでしょう。この記事では
D:\OpenJDK\jdk7
にJDKをコピーしました。

### Freetypeのダウンロード

Freetypeとはフォント描画ライブラリです。AdoptOpenJDKのビルドに必要です。
（OpenJDK 11では同梱されており不用みたいです。）

ソースからビルドしてもよいのですが、今回はビルド済みのものを取得します。
~~Visual Studio 2013を利用しているので、vc12 64bitをダウンロードします。
https://www.opencascade.com/content/3rd-party-components~~

Windows用のバイナリは以下に最新版があります
https://github.com/ubawurinna/freetype-windows-binaries

`git clone https://github.com/ubawurinna/freetype-windows-binaries`
としても良いですし、zipファイルを取得してもかまいません。

この記事では取得したファイル群を
D:\OpenJDK\freetype
以下にコピーしました。

freetype以下の構成は

* include/
* win32/
* win64/
* FTL.TXT
* GPLv2.TXT
* LICENSE.TXT
* README.txt

となっていると思います。
64ビットのJDKを作る場合はビルドのためにwin64をlibに名称変更します

* include/
* lib/
* win32/
* FTL.TXT
* GPLv2.TXT
* LICENSE.TXT
* README.txt

## ビルド

### ソースコードの取得

Cygwin64 Terminalを立ち上げます。

* `git clone https://github.com/AdoptOpenJDK/openjdk-jdk8u`
 でAdoptOpenJDK8
* `git clone https://github.com/corretto/corretto-8`
 でAmazon Corret 8

それぞれのソースコードを取得できます。

### ソースコードの修正
~~今回問題になっている文字の回転がなされない不具合は、すでにOpenJDK9で修正されていそうなことがわかりました。
https://bugs.openjdk.java.net/browse/JDK-8163278?focusedCommentId=13999670&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-13999670
上記ページのパッチ
https://bugs.openjdk.java.net/secure/attachment/63104/jdk9.patch
を素直に反映してみます。AdoptOpenJDK8の修正場所は
openjdk-jdk8u/jdk/src/share/native/sun/font/freetypeScaler.c
です。~~

すでにJDK11のfreetypeScaler.cで修正がなされており、このコードをバックポートします。
https://github.com/AdoptOpenJDK/openjdk-jdk11u/commit/f1bf238b695e0b4d49b8264b83228317ee75ebd3#diff-5c6198e34c46737fc7bf8f0eb5fff8d0

JDK11のfreetypeScaler.cを
jdk/src/share/native/sun/font/freetypeScaler.c
に上書きしました。

## ビルド

### configure

* AdoptOpenJDK8 は openjdk-jdk8u/
* Amazon Corretto は corretto-8/src/

にて、以下のコマンドを実行します。
`bash configure --with-boot-jdk=/cygdrive/d/OpenJDK/jdk7 --with-freetype=/cygdrive/d/OpenJDK/freetype --disable-debug-symbols --disable-zip-debug-info`

--with-boot-jdk
にはJDKの場所を
--with-freetype
にはfreetypeの場所を指定します。

--disable-debug-symbols --disable-zip-debug-info
を付与することでデバッグ情報を削除し、出来上がるJRE/JDKのファイルサイズを減らすことができます

#### configureの罠

最初は上記コマンドのとおりにconfigureをやってもうまく動きませんでした。

「generated-configure.sh」がバグっているとおもって眺めていたのですが、ふとWindowsのファイルパスの罠に気づきました。

Windowsはファイルパスに半角スペースが入っていてもバックスラッシュでエスケープする必要はありませんが、Linux等ではエスケープが必要です。
で、generated-configure.shは意図的にWindowsの短縮ファイル名を使うようにし、半角スペースを取り扱わないように工夫していました。
ところが（Windows 10の途中のバージョンから？）短縮ファイル名を作らない場合があるみたいなのです。

コマンドプロンプトで「dir /x」で確認するとわかりました。
`fsutil file setshortname "Microsoft Visual Studio 12.0" MICROS~2`
コマンドで短縮名を登録してあげたら、無事configureを終わらせることができました。
![dirx.png](https://qiita-image-store.s3.amazonaws.com/0/8851/7ad05a2c-dee0-9b98-305e-458fd3654b09.png)

### make

* AdoptOpenJDK 8はopenjdk-jdk8u/
* Amazon Corretto 8はcorretto-8/src/

にて
`make images`
とすれば、
build/windows-x86_64-normal-server-release/images/j2re-image
にJREのイメージが
build/windows-x86_64-normal-server-release/images/j2sdk-image
にJDKのイメージが作成されます。

`make images　COMPRESS_JARS=true`
とすれば生成されるイメージを圧縮し、ファイルサイズを減らすことができます。

# 結果

Oracleとは若干見栄えが異なるものの、文字回転の不具合は修正することができました。

*修正されたAdoptOpenJDK 8 / Amazon Corretto 8*
![fontRender.png](https://qiita-image-store.s3.amazonaws.com/0/8851/ab670a1a-086d-9eff-475a-59ef84ea9d28.png)

*OracleJDK8の場合*
![OracleJDK8.png](https://qiita-image-store.s3.amazonaws.com/0/8851/5995708b-63b5-9ff3-bea0-f0c69ed0ed93.png)

見栄えの違いはフォント描画ライブラリ(FreeType or F2T)の違いによるものと考えます。
https://github.com/AdoptOpenJDK/openjdk-build/wiki/Differences-between-Adopt-OpenJDK-binaries-and-Oracle-JDK-Binaries


# 蛇足

## AdoptOpenJDKかAmazon Correttoか

AdoptOpenJDKは多くの企業がスポンサーしており、IBMとMicrosoftがスポンサーしているのは強みです。
https://adoptopenjdk.net/sponsors.html

Amazon Correttoはセンセーショナルですが、いまのところAmazon一企業のみのサポートであり、AWSにロックオンされるものなのかもしれません。
今後の展開に注目ですね。

## 今回の作業を通じて…

私はすでに公開されている修正パッチをAdoptOpenJDK 8 / Amazon Corretto 8にバックポートしたにすぎませんが、ひょっとしたら自分以外の世の中の誰かの役に立つかもしれないって思うと、オープンソースって素晴らしいですね。
こんな機会を恵んでくれたOracle、ありがとう！