All About ACS: IBM i Access Client Solutions 用のJavaの選択と利用

久々の ACS の記事です。いよいよ、Oracle Java の 商用利用が有償化されるので ACS に使う Java について書きました。

#  Oracle Java の商用利用有償化

これまでは Oracle が配布するJavaを商用であっても無償利用することができましたが、2019年1月から商用利用のダウンロードができなくなりました。
できなくなるのは、新たな商用利用のダウンロードで、ダウンロード済みのものをダウンロード時に同意したライセンス条項で利用することはできるという理解です。この場合、もちろん、新たなセキュリティ更新は利用できないので、お勧めできる利用形態ではありません。

# ACSには、どのJavaを使えばいいのかという IBM からの情報
ACSには、どのJavaを使えばいいのかという情報として、IBM から [Java Options for IBM i Access Client Solutions?](https://www-01.ibm.com/support/docview.wss?uid=ibm10719405) が公開されました。

ざっくり言えば、ACS は Java で動くように作ってあり(1.1.8 以降 はJava 8 以降が必要)、OpenJDK でもいいと言っています。
OpenJ9 JVM 版の AdoptOpenJDK なら、IBM の有償サポートも利用できます。

ACS は Java に依存するだけなので、Java がまともに動いていれば「Write once, run anywhere (WORA)」のキャッチフレーズのように、どの Java でもいいはずです。

ただ、ACS のサポートは ACS をサポートするだけで、Java のサポートは同然しません。Java 側に問題がある場合は、お客様が Java の入手方法に応じて Java 提供元のサポートを得る必要があります。
結局、どの Java を使うのかは、Java 8 以降という制限以外は、お客様のポリシーで選択いただくことになります。

# 32 ビット ? 64 ビット ?
Java には、32 ビット版と 64 ビット版があります。
以前は、ACS EHLLAPI は 32 ビット版 Java でしか動かなかったのですが、1.1.8.1 から 64 ビット版 Java でも動くようになりました。

> Starting at IBM i Access Client Solutions 1.1.8.1 when used with the IBM i Access Client Solutions EHLLAPI Bridge 8.18.316 or later code levels the IBM i Access Client Solutions EHLLAPI environment is now supported in a 64-bit Java runtime.
> [EHLLAPI With the Access Client Solutions Emulator](http://www-01.ibm.com/support/docview.wss?uid=nas8N1010639)

32 ビット Java を使う必要があるのは、OS が 32 ビットの時だけになりました。

(2019/06/24 追記ｰここから)

32 ビット Java を使っていると、下記のように1GBのヒープが取れないとエラーになることもあります。その対応のためにも64 ビット Javaを使うべきです。
```
C:\ACS\IBMiAccess_1.1.8.2\Start_Programs\Windows_i386-32>acslaunch_win-32.exe
Error occurred during initialization of VM
Could not reserve enough space for 1048576KB object heap
```

なお、Java VM が IBM の j9 の場合、1GBのヒープが取れないエラーは下記のとおりです。
```
C:\ACS\IBMiAccess_1.1.8.2\Start_Programs\Windows_i386-32>acslaunch_win-32.exe
JVMJ9VM015W ライブラリー j9gc29(2) の初期化エラー: ヒープのインスタンス化に失敗しました。1G が要求されました
[JavaAppLauncher Error] Error starting up JVM.
```

なお、OSが32 ビットのため32ビットJavaしか使えない場合、[ダウンロードサイト](https://www.ibm.com/services/forms/preLogin.do?source=swg-ia)からIBMiAccess_v1r1.zip を再度ダウンロードし、導入先し直してください。発生しにくくなるように下記のファイルが更新されています。

- Start_Programs\Windows_i386-32/acslaunch_win-32.exe
- Start_Programs\Windows_i386-32/acsnative.dll

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/f85255d4-41f0-f50d-6fe2-e2859b8dec3f.png)

(2019/06/24 追記ｰここまで)

# インストーラーを使わない Unzip で導入する Java の利用
Oralce JREは、通常、インストーラーで導入しました。そのため、Java の導入先を意識する必要はありませんでした。
しかし、OpenJDK は zip 形式で提供され、導入は unzip するだけだったりします。
この場合、acslaunch_win-XX.exe は、導入した Java を見つけらず、ACS が起動できません。アイコンのクリックや .hod などの拡張子の関連付けによる起動も exe 経由なのでできません。

# JAVA_HOME 環境変数に Java の導入先を指定
acslaunch_win-XX.exe は環境変数「JAVA_HOME」で Java  を見つけることができます。

[Java Options for IBM i Access Client Solutions?](https://www-01.ibm.com/support/docview.wss?uid=ibm10719405) 

> JAVA_HOME environment variable.  If the User or System environment variable is pointing to the location of a valid, compatible Java runtime this will be used to launch IBM i ACS. 



# Java を ACS の導入先にコピーして安全に使う (2019/06/27 記載)

こんな方法もあります。

[Java Options for IBM i Access Client Solutions?](https://www-01.ibm.com/support/docview.wss?uid=ibm10719405) 

> Place the Java JRE folder next to the acslaunch program that is being used.

専用の記事を書きました。こちらをご覧ください。

[Java を ACS 専用にして安全にする](https://qiita.com/6onoda/items/1e63dfc76bc9b0f6f140) - 2019-06-27 作成


Java の場所を -vm で指定する方法もありますが、こちらの方法であれば、アイコンのクリックや .hod などの拡張子の関連付けによる起動もできるので、お勧めです。

環境変数を指定しても正常に起動しない場合は、下記から(ESSからでなく) ACSをダウンロードしなおししてみてください。

https://www.ibm.com/services/forms/preLogin.do?source=swg-ia

acslaunch_win-XX.exe が更新されている場合があります。執筆時点のプログラムは下記になっています。

| プログラム | タイムスタンプ |
|:-:|:-:|:-:|
| acslaunch_win-64.exe   |   2018/11/16 | 
| acslaunch_win-32.exe    |  2018/12/13 |  


# Java12 や 11.0.4 では OpenJDK や Oracle 9 以降で横方向用紙に印刷ができないの件も修正済み

OpenJDK を使う一番の問題は、画面印刷やJava Print Service(JPS) で、横方向用紙に印刷ができないことです。Java 自体のバグですので ACS では、どうしようもありませんでした。
これは、ACS の問題ではなく 3 年以上前から存在する Java のバグです。

Java 12 では GA 時点から修正済みです。
[Wrong fontMetrics when printing in Landscape (OpenJDK)](https://bugs.openjdk.java.net/browse/JDK-8139178)

Java 11 では2019年7月に利用可能になった 11.0.4 で修正されました。
[https://bugs.openjdk.java.net/browse/JDK-8223503](Wrong fontMetrics when printing in Landscape (OpenJDK))

# ただし、Java 9 以降画面レイアウトが崩れる場合がある (2019/06/24 追加)

Java 9 以降を使うと、レイアウトが崩れる場合があります。詳しくは下記をご覧ください。

https://qiita.com/6onoda/items/fd8c42ec3088c4ef105d

***
### 履歴

2019/06/24
- 32 ビット Javaで 1GB ヒープが取れないという事象の追記
- Java 9 以降画面レイアウトが崩れる場合がある情報の追記
2019/06/27 
- Java を ACS の導入先にコピーして安全に使う項目を追記
2019/06/28 
- 体裁の修正
2019/07/02
- 32ビットJavaで、j9 Java の場合の1GBのヒープが取れないとエラーを追記
2019-07-21
- 横方向印刷の修正が Java 11.0.4 にも行われたことを記載。項目の文章全体を修正
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***