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
とか書かれてるので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のビルドは難しいのだと.