direnvでIntelliJ IDEAで指定したVersionのJavaに切り替える
direnvを使うとディレクトリに応じて環境変数の切り替えができるので、
JAVA_HOMEを切り替えで、利用するJavaのVersionを変更することが出来ます。
direnv/direnv | GitHub
https://github.com/direnv/direnv
参考: direnv で java を切り替える | Qiita
https://qiita.com/tonluqclml/items/8252e263f006d5d2057a
ところで、
ディレクトリ配下で利用するJavaのVersionはIntelliJ IDEAでも指定しており、
direnvでも指定すると不整合がおきて面倒になる可能性があります。
そこで、IntelliJ IDEAで設定したVersionに切り替えられないかを考えてみました。
IntelliJ IDEAで指定したJavaのVersionは.idea/misc.xml
に記載されています。
.idea/misc.xml
の抜粋
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK" />
このファイルからVersion情報を取得して環境変数を設定する処理を、
次のように~/.direnvrc
に作成します。
(UbuntuLinuxとmacos用です)
~/.direnvrc
# Usage: use dotideajava
# Loads Java version defined in .idea/misc.xml.
#
# Add following command to your project .envrc.
# use_dotideajava
#
use_dotideajava() {
if [ -f .idea/misc.xml ]; then
java_version=$(cat .idea/misc.xml | grep JavaSDK | sed -e "s/.*project-jdk-name=\"\([0-9.]*\).*/\1/")
if [ "$java_version" = "" ]; then
return
fi
if [ -d /usr/lib/jvm ]; then
jvm_name=$(ls /usr/lib/jvm/ | grep $(cat .idea/misc.xml | grep JavaSDK | sed -e "s/.*project-jdk-name=\"\([0-9.]*\).*/\1/") | tail -1)
if [ ! "$jvm_name" = "" ]; then
export JAVA_HOME=/usr/lib/jvm/$jvm_name
export PATH=$JAVA_HOME/bin:$PATH
fi
elif [ "$(uname)" == "Darwin" ]; then
export JAVA_HOME=`/usr/libexec/java_home -v $java_version`
fi
fi
}
設定したいディレクトリに移動して、direnv edit .
で.envrc
を次のように編集すると、
IntelliJ IDEAの設定に応じてJAVA_HOMEが切り替わります。
.envrc
use_dotideajava
但し、
IntelliJ IDEAのSDKの設定で、
project-jdk-nameをデフォルトの名称から変更していると、
この方法では切り替えできません。
以上。