前書き:SDKMANはbash(もしくはzsh)前提
SDKMANは、JDK(Java開発環境)やGroovy、Scala、Gradleなどのバージョン管理ツールです。主に、JVM系のツールを管理します。Rubyのrbenv、Pythonのpyenvと同様の立ち位置のツールであり、CLIから任意のバージョンのソフト(例:Java)をインストール/使用/削除できます。
SDKMANの公式サイトに書かれている通り、SDKMANはbashで実装されています。そのため、Login Shellがbashの場合は問題なく動作しますが、fish環境では実行時にエラーが出てしまいます。
本記事では、fish環境にSDKMANをイントールし、SDKMAN経由でJava(JDK)をインストールする方法を紹介します。
検証環境
_,met$$$$$gg. nao@debian
,g$$$$$$$$$$$$$$$P. ----------
,g$$P" """Y$$.". OS: Debian GNU/Linux 10 (buster) x86_64
,$$P' `$$$. Kernel: 4.19.67
',$$P ,ggs. `$$b: Uptime: 25 mins
`d$$' ,$P"' . $$$ Packages: 4325 (dpkg), 13 (flatpak)
$$P d$' , $$P Shell: fish 3.0.2
$$: $$. - ,d$$' Resolution: 2560x1080
$$; Y$b._ _,d$P' DE: Pantheon
Y$$. `.`"Y$$$$P"' WM: Mutter(Gala)
`$$b "-.__ Terminal: io.elementary.t
`Y$$ CPU: AMD Ryzen 7 3800X 8- (16) @ 3.900GHz
`Y$$. GPU: NVIDIA NVIDIA Corporation TU107
`$$b. Memory: 3457MiB / 64404MiB
`Y$$b.
`"Y$b._
SDKMANのインストール
まず、SDKMANの依存パッケージをインストールします。SDKMAN公式サイトに依存パッケージ情報(curl, zip/unzip)が記載されていますが、実際は以下のパッケージ5個をインストールしなければいけません。
$ sudo apt install bash zip unzip curl sed
次に、SDKMANをインストールします。curlコマンドで、SDKMANをインストールするためのShell Scriptをダウンロードし、その内容をbashで実行します。
$ curl -s "https://get.sdkman.io" | bash
上記のコマンドが成功すれば、SDKMANは"$HOME/.sdkman"にインストールされます。
fishとfisherをインストール
この段階でLogin Shellをfish(shell)に変更していない場合、以下の記事を参考に変更してください。また、SDKMANをfishで使うには、fisher(fishプラグインマネージャ)も必要ですので、合わせてインストールしてください。
SDKMAN! for fishプラグインのインストール
SDKMANは、bash起動時に設定ファイル(sdkman-init.sh)を読み込みます。この仕組みがfishでは上手く動かないので、別途プラグイン(SDKMAN! for fish)をインストールする事によって、この問題を解決します。
プラグインのインストール手順は、以下の通りです。
$ fisher add reitzig/sdkman-for-fish@v1.4.0
[the_ad id=“598”]
Javaのインストール
ここまでの手順でSDKMANが動作します。ここからは、Javaをインストールする手順を説明します。
まずは、インストールできるJavaのVersionを確認します。前提情報ですが、Javaは複数のベンダが公開しているJDKディストリビューションがあります。いずれのJDKも、マルチプラットフォーム(Win/Mac/Linux)対応であり、OpenJDKをベースにしています。特にこだわりがなければ、リファレンス実装であるJava.netが公開しているJDKを選択しましょう。
以下、OpenJDK(Version13.02)のインストール手順です。
$ sdk selfupdate (注釈):SDKMAN自体を更新
$ sdk list java
================================================================================
Available Java Versions
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
AdoptOpenJDK | | 14.0.2.j9 | adpt | | 14.0.2.j9-adpt
| | 14.0.2.hs | adpt | | 14.0.2.hs-adpt
| | 13.0.2.j9 | adpt | | 13.0.2.j9-adpt
| | 13.0.2.hs | adpt | | 13.0.2.hs-adpt
| | 12.0.2.j9 | adpt | | 12.0.2.j9-adpt
| | 12.0.2.hs | adpt | | 12.0.2.hs-adpt
| | 11.0.8.j9 | adpt | | 11.0.8.j9-adpt
| | 11.0.8.hs | adpt | | 11.0.8.hs-adpt
| | 8.0.265.j9 | adpt | | 8.0.265.j9-adpt
| | 8.0.265.hs | adpt | | 8.0.265.hs-adpt
Amazon | | 11.0.8 | amzn | | 11.0.8-amzn
| | 8.0.265 | amzn | | 8.0.265-amzn
Azul Zulu | | 14.0.2 | zulu | | 14.0.2-zulu
| | 13.0.4 | zulu | | 13.0.4-zulu
| | 13.0.4.fx | zulu | | 13.0.4.fx-zulu
| | 12.0.2 | zulu | | 12.0.2-zulu
| | 11.0.8 | zulu | | 11.0.8-zulu
| | 11.0.8.fx | zulu | | 11.0.8.fx-zulu
| | 10.0.2 | zulu | | 10.0.2-zulu
| | 9.0.7 | zulu | | 9.0.7-zulu
| | 8.0.265 | zulu | | 8.0.265-zulu
| | 8.0.265.fx | zulu | | 8.0.265.fx-zulu
| | 8.0.232.fx | zulu | | 8.0.232.fx-zulu
| | 7.0.262 | zulu | | 7.0.262-zulu
| | 6.0.119 | zulu | | 6.0.119-zulu
BellSoft | | 14.0.2.fx | librca | | 14.0.2.fx-librca
| | 14.0.2 | librca | | 14.0.2-librca
| | 13.0.2.fx | librca | | 13.0.2.fx-librca
| | 13.0.2 | librca | | 13.0.2-librca
| | 12.0.2 | librca | | 12.0.2-librca
| | 11.0.8.fx | librca | | 11.0.8.fx-librca
| | 11.0.8 | librca | | 11.0.8-librca
| | 8.0.265.fx | librca | | 8.0.265.fx-librca
| | 8.0.265 | librca | | 8.0.265-librca
GraalVM | | 20.2.0.r11 | grl | | 20.2.0.r11-grl
| | 20.2.0.r8 | grl | | 20.2.0.r8-grl
| | 20.1.0.r11 | grl | | 20.1.0.r11-grl
| | 20.1.0.r8 | grl | | 20.1.0.r8-grl
| | 20.0.0.r11 | grl | | 20.0.0.r11-grl
| | 20.0.0.r8 | grl | | 20.0.0.r8-grl
| | 19.3.1.r11 | grl | | 19.3.1.r11-grl
| | 19.3.1.r8 | grl | | 19.3.1.r8-grl
Java.net | | 16.ea.13 | open | | 16.ea.13-open
| | 15.ea.36 | open | | 15.ea.36-open
| | 14.0.2 | open | installed | 14.0.2-open
| | 13.0.2 | open | | 13.0.2-open
| | 12.0.2 | open | | 12.0.2-open
| | 11.0.8 | open | | 11.0.8-open
| >>> | 10.0.2 | open | installed | 10.0.2-open
| | 9.0.4 | open | | 9.0.4-open
| | 8.0.265 | open | installed | 8.0.265-open
SAP | | 14.0.2 | sapmchn | | 14.0.2-sapmchn
| | 13.0.2 | sapmchn | | 13.0.2-sapmchn
| | 12.0.2 | sapmchn | | 12.0.2-sapmchn
| | 11.0.8 | sapmchn | | 11.0.8-sapmchn
================================================================================
Use the Identifier for installation:
$ sdk install java 11.0.3.hs-adpt
================================================================================
$ sdk install java 13.0.2-open (注釈):OpenJDKのインストール
Downloading: java 13.0.2-open
In progress...
################################################################## 100.0%
Repackaging Java 13.0.2-open...
Done repackaging...
Installing: java 13.0.2-open
Done installing!
Do you want java 13.0.2-open to be set as default? (Y/n): Y (注釈):インストールしたJDKをデフォルトJDKに変更
Setting java 13.0.2-open as default.
環境変数JAVA_HOMEの設定
最後に、JDKのインストール先を環境変数JAVA_HOMEに設定します。
SDKMANがインストールするJDKは、"$HOME/.sdkman/candidates/java/“以下にインストールされます。同ディレクトリ内にcurrentというシンボリックリンクがあり、このリンクはデフォルトJDKのディレクトリを指しています。
$ ls -al /home/nao/.sdkman/candidates/java/
合計 24
drwxr-xr-x 6 nao nao 4096 8月 30 12:35 ./
drwxr-xr-x 4 nao nao 4096 8月 13 19:46 ../
drwxr-xr-x 9 nao nao 4096 8月 30 00:15 10.0.2-open/
drwxr-xr-x 8 nao nao 4096 8月 30 12:35 13.0.2-open/
drwxr-xr-x 8 nao nao 4096 8月 13 19:46 14.0.2-open/
drwxr-xr-x 9 nao nao 4096 7月 27 20:49 8.0.265-open/
lrwxrwxrwx 1 nao nao 11 8月 30 12:35 current -> 13.0.2-open/
そのため、環境変数JAVA_HOMEには”$HOME/.sdkman/candidates/java/current"を設定します。使用するJDKを変更したとしても、SDKMANがcurrentシンボリックリンクが指すディレクトリを変更してくれるため、環境変数JAVA_HOMEの設定を修正する必要がありません。
以下、fishの設定ファイル($HOME/.config/fish/config.fish)に環境変数JAVA_HOMEを設定する例です。
$ nvim ~/.config/fish/config.fish (注釈) 使用するエディタは任意
# 以下の二行を追記
set -x JAVA_HOME $HOME/.sdkman/candidates/java/current/
set -x PATH $PATH $JAVA_HOME/bin
