• 作成:

eclipse.jdt.lsはGentooだとopenjdk-binのバージョン11では動きますがopenjdkの方では動かないので要注意

オチ

openjdkではなくopenjdk-binを使えば解決です.

問題

EmacsでJava開発をする時eglotではなくlsp-modeを使えば割とあっさり構築完了しました - ncaq に書いた通り eclipse/eclipse.jdt.ls: Java language server を使っているのですが,

eclipse.jdt.lsがOpenJDK 11だと動かなくてOpenJDK 9だと動きます.

JDK 11をシステムのVMに設定しているとソースコード全体に

Java: The type java.lang.Class cannot be resolved

みたいなエラーが発生して全く機能しなくなります.

Note: currently, the build can only run when launched with JDK 8. JDK 9 or more recent versions can be used to run the server though.

とか

run with JDK 11

Add Java 11 support · Issue #735 · eclipse/eclipse.jdt.ls

とか書かれてるのでJDK 11でも動くと思ったのですがとにかく動きません.

こんなことをしているからバグのあるOpenJDK 11を引いてるのかもしれません. Gentoo LinuxでUSEフラグをunmaskしてopenjdk 11のgentoo-vmフラグを有効化してシステムのJavaとしてインストールする - ncaq

まあそういう訳でシステムのJVMは今の所JDK 8を使うしか無いのですが, 実際にビルドするシステムのJavaのバージョンは11が必要です.

システム全体ではJava 8を使って, プロジェクトをビルドする時だけはJava 11を使う必要があるというわけですね.

GradleがJDKをダウンロードしてきてビルドとかしてくれれば楽なんですけどね…(Stack的思考)

Gentooでの解決法

色々考えたのですがシステムのJVMが11で認識させる状態じゃないとJVM設定を11にして無駄なので, 仕方なくJAVA_HOMEを設定する方法を使うことにしました.

しかし単純にJAVA_HOMEを設定しても何故か設定出来ないので, 色々一気に設定する必要がありました.

Gentoo Linuxで設定するには,

% java-config -L
The following VMs are available for generation-2:
1)	IcedTea JDK 3.14.0 [icedtea-8]
2)	OpenJDK 11.0.5_p10 [openjdk-11]
*)	OpenJDK 8.232_p09 [openjdk-8]

でJDKの一覧を出して,

% java-config --print=openjdk-11
# Autogenerated by java-config
# Java Virtual Machine: OpenJDK 11.0.5_p10
JAVA_HOME=/usr/lib64/openjdk-11
JDK_HOME=/usr/lib64/openjdk-11
JAVAC=/usr/lib64/openjdk-11/bin/javac
PATH=/usr/lib64/openjdk-11/bin
ROOTPATH=/usr/lib64/openjdk-11/bin
LDPATH=/usr/lib64/openjdk-11/lib/:/usr/lib64/openjdk-11/lib/server/
MANPATH=

で環境変数一覧を出力して,

そのままだと他のPATHが消滅してしまうので(/etc/env.d向けの出力?) PATHだけ既存のを追加して,

#!/bin/bash

export JAVA_HOME=/usr/lib64/openjdk-11
export JDK_HOME=/usr/lib64/openjdk-11
export JAVAC=/usr/lib64/openjdk-11/bin/javac
export PATH=/usr/lib64/openjdk-11/bin:$PATH
export ROOTPATH=/usr/lib64/openjdk-11/bin
export LDPATH=/usr/lib64/openjdk-11/lib/:/usr/lib64/openjdk-11/lib/server/

と記述したファイルをdevel-envみたいな名前でプロジェクトに保存して.gitignoreで無視して貰います.

gradleを動かすシェルだけで. devel-envとかで読み込んで解決です.

何かもっとマシな解決方法がありそうですが, これぐらいしか思いつきませんでした…

本当の解決法

これ書いた後に自分でビルドする仕組みのdev-java/openjdkで問題が出たのであって, AdoptOpenJDKを使っているdev-java/openjdk-binを使えば問題が出ないのではないか? 昨日ちょっと試してみようとしてgentoo-vmがマスクされてるから面倒だったのでやめたけど実はこちらだと動くのではないか? と思って試してみました.

動きました. 昨日半日格闘したのはいったい何だったんだ. 非常に虚しい.

LinuxディストリビューションだとみんなJDK自前でビルドしてるのに, AdoptOpenJDKがありがたがられたのはいったい何故なのか分かりませんでした. 今わかりました. JDKのビルドは難しいのだと.