sun java 9 はやっぱり sun java 9 だった

ちょっと古い話題 ( sun 純正のライブラリ ) があるので sun java 9 ということで。
sun java は日本語だと語呂が良い(「さんじゃば」)けれど、ora java とか cle java とかに略さずに oracle java という表記しかないなあ。

〇 オチ
oracle java 9 は依然として add-apt-repository ppa:webupd8team/java を使用します。

〇 前提
linux 系 OS で使用できる java の実装として OpenJDK 系統と Oracle JDK 系統があります。現時点 ( 2018/03/01 ) では両方ともに oracle が開発しています。違いはいろいろありますが、JavaOne 2017 では「有償版が Oracle JDK、無償版が OpenJDK。2018 年後半を目途に両者のバイナリは互換性を持つ。」という話が出ています。
cf. gihyo.jp での JavaOne 2017 レポート 2 回目
cf. スラドの「LTS版JDKの入手にはOracleサポート契約が必須になる?」という記事

〇 本題
qiita で以下のような記事を発見
もうJava9にadd-apt-repositoryは要らない
まあ、OpenJDK しかいらないのであれば上記の記事で合っていますが、拾ってきたコードで com.sun.compile.reflection.* みたいなのを使用していると OpenJDK では手に負えなくなります。
解決策としては「Oracle JDK を使え」になるのですが、その場合は add-apt-repository する方法が必要になります。具体的には以下のようなコマンドを叩きます。


sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java9-installer

cf. Install Oracle Java 9 (JDK9) in Ubuntu, Linux Mint or Debian via PPA
やっていることは oracle 本家からダウンロードして環境変数等をそろえているだけらしいので、普通に oracle 本家から java の tar.gz を落とす -> 環境変数 JAVA_HOME を設定する -> PATH に ${JAVA_HOME}/bin を通す、のが良さそうです。
まあ rpm も用意されていますが、Ubuntu ( apt ) 使っていて更に rpm も使うのはちょっとした悪夢 ( 絶対 rpm 使っていたことを忘れる ) に思えます。

ちなみに、上記 qiita の記事の引用元は↓
Can not install ‘openjdk-9-jdk’ because it tries to overwrite file aready included in ‘openjdk-9-jdk-headless’ [duplicate]
これ、openjdk-9-jdk と openjdk-9-jdk-headless パッケージを両方入れようとすると /usr/lib/jvm/java-9-openjdk-amd64/include/linux/jawt_md.h でバッティングしてしまってインストールできない、という話です。
解決策としては
・headless 版だけ入れる
・qiita の記事のようにする ( sudo dpkg -i –force-overwrite を指定して .deb パッケージを入れる )
となりました。

〇 余談
何故 oracle Java が必要かというと、java 8 で書いたソースからの移行に –add-exports や –add-opens といった引数を指定したいと思ったからです ( 結局不要だったのですが)。
oracle java の方で “java -X” とかとやると使用方法が出てきます。
cf. Oracle JDK 9 Migration Guide の Migrating to JDK 9
↓を見ると java の modular system ( Project Jigsaw ) で使えるようなのですが、
JEP 261: Module System
jupyter-jvm-basekernel のコンパイル ( ./gradlew build ) で OpenJDK を使うと以下のようなエラーが出ます。


java.lang.IllegalAccessException: class org.gradle.api.internal.tasks.compile.reflect.SourcepathIgnoringInvocationHandler cannot access class com.sun.tools.javac.file.BaseFileManager (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.file to unnamed module @XXXXXXXX

XXXXXXXX は任意の小文字 or 数字
sun java では特にコマンドオプションを付けることなく無事 build できました。
cf. jupyter-jvm-basekernel

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

plese input * Time limit is exhausted. Please reload CAPTCHA.