【技術覚書】IntelliJ IDEAのCommandターミナルで環境変数JAVA_HOMEを設定する

2024/12/12に公開

はじめに

私はIntelliJ IDEAを利用しています。先日Docker で Spring Boot - 公式サンプルコードの内容を実施しているときに、gradlew.batコマンドスクリプトをターミナルから動かす必要がありました。しかし動かした際JAVA_HOMEが未設定とのメッセージが表示されました。
環境変数JAVA_HOMEはプロジェクトで設定したバージョンのJavaにあわせたい。
先人の方々の解決策が提示されていますがCommandのターミナルで動かしたほうが私にとって直感的でしたので、JAVA_HOME設定するBATスクリプトsetenv_JAVA_HOME.batを作成しました。

実行スクリプト setenv_JAVA_HOME.bat

前提

  • IntelliJ IDEAの利用
  • ターミナルでCommandプロンプトでの利用

スクリプトに利用した外部ツール

スクリプト本体

@echo off

rem 元のPATHを保存
set "PATH_ORIG=%PATH%"

rem sedとxmllintのパスを設定
set "GIT_USR_HOME=C:\Users\Hgbfbubtj9tru6j\AppData\Local\Programs\Git\usr"
set "XMLLINT_HOME=C:\Users\Hgbfbubtj9tru6j\AppData\Local\Programs\xmllint-win32-x86_64"
set "PATH=%GIT_USR_HOME%\bin;%XMLLINT_HOME%;%PATH%"

rem IDEAの設定ファイルパスを設定
set "IDEA_MISC_XML=.idea\misc.xml"
set "JDK_TABLE_XML=%APPDATA%\JetBrains\IdeaIC2024.3\options\jdk.table.xml"

rem xmllintを使用してJDK_NAMEを取得
for /f "tokens=*" %%i in ('xmllint --xpath "string(//component[@name='ProjectRootManager']/@project-jdk-name)" %IDEA_MISC_XML%') do set "JDK_NAME=%%i"

rem xmllintを使用してJAVA_HOMEを取得
for /f "tokens=*" %%i in ('xmllint --xpath "string(/application/component/jdk[./name/@value='%JDK_NAME%']/homePath/@value)" %JDK_TABLE_XML%') do set "JAVA_HOME=%%i"

rem JAVA_HOMEのパスを修正
for /f "tokens=*" %%i in ('echo %JAVA_HOME% ^| sed -e "s#/#\\\\#g"') do set "JAVA_HOME=%%i"
for /f "tokens=*" %%i in ('echo %JAVA_HOME% ^| sed -e "s#\$USER_HOME\$#C:\\\\Users\\\\Hgbfbubtj9tru6j#" -e "s# $##"') do set "JAVA_HOME=%%i"

rem 環境変数を設定
set "JAVA_HOME=%JAVA_HOME%"
set "PATH=%JAVA_HOME%\bin;%PATH_ORIG%"

rem 環境変数を設定
set GIT_USR_HOME=
set XMLLINT_HOME=
set IDEA_MISC_XML=
set JDK_TABLE_XML=
set PATH_ORIG=
set JDK_NAME=

スクリプト利用例

IntelliJ IDEAのターミナルでCommand.comを起動し、このスクリプトを利用した場合を示します。

Microsoft Windows [Version 10.0.22631.4460]
(c) Microsoft Corporation. All rights reserved.

C:\Users\Hgbfbubtj9tru6j\source\repos\gs-spring-boot-docker\complete>java --version
'java' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\Hgbfbubtj9tru6j\source\repos\gs-spring-boot-docker\complete>setenv_JAVA_HOME.bat

C:\Users\Hgbfbubtj9tru6j\source\repos\gs-spring-boot-docker\complete>java --version
openjdk 17.0.13 2024-10-15 LTS
OpenJDK Runtime Environment Corretto-17.0.13.11.1 (build 17.0.13+11-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.13.11.1 (build 17.0.13+11-LTS, mixed mode, sharing)

PowerShell版

スクリプト本体

# 元のPATHを保存
$PATH_ORIG = $env:PATH

# sedとxmllintのパスを設定
$GIT_USR_HOME = "C:\Users\Hgbfbubtj9tru6j\AppData\Local\Programs\Git\usr"
$XMLLINT_HOME = "C:\Users\Hgbfbubtj9tru6j\AppData\Local\Programs\xmllint-win32-x86_64"
$env:PATH = "$GIT_USR_HOME\bin;$XMLLINT_HOME;$env:PATH"

# IDEAの設定ファイルパスを設定
$IDEA_MISC_XML = "..\.idea\misc.xml"
$JDK_TABLE_XML = "$env:APPDATA\JetBrains\IdeaIC2024.3\options\jdk.table.xml"

# xmllintを使用してJDK_NAMEを取得
$JDK_NAME = & xmllint --xpath "string(//component[@name='ProjectRootManager']/@project-jdk-name)" $IDEA_MISC_XML

# xmllintを使用してJAVA_HOMEを取得
$JAVA_HOME = & xmllint --xpath "string(/application/component/jdk[./name/@value='$JDK_NAME']/homePath/@value)" $JDK_TABLE_XML

# JAVA_HOMEのパスを修正
if ($JAVA_HOME -is [System.Array]) {
    $JAVA_HOME = $JAVA_HOME -join "`n"
}
$JAVA_HOME = $JAVA_HOME -replace '/', '\\'
$JAVA_HOME = $JAVA_HOME -replace '\$USER_HOME\$', 'C:\Users\Hgbfbubtj9tru6j'
$JAVA_HOME = $JAVA_HOME.TrimEnd()

# 環境変数を設定
$env:JAVA_HOME = $JAVA_HOME
$env:PATH = "$JAVA_HOME\bin;$PATH_ORIG"

# 環境変数をクリア
Remove-Variable -Name GIT_USR_HOME, XMLLINT_HOME, IDEA_MISC_XML, JDK_TABLE_XML, PATH_ORIG, JDK_NAME

スクリプト利用例

Copyright (C) Microsoft Corporation. All rights reserved.

Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows

PS C:\Users\Hgbfbubtj9tru6j\source\repos\azure-container-dev-book\apps\part3> cd backend
PS C:\Users\Hgbfbubtj9tru6j\source\repos\azure-container-dev-book\apps\part3\backend> java --version
java : The term 'java' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is        
correct and try again.
At line:1 char:1
+ java --version
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (java:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\Users\Hgbfbubtj9tru6j\source\repos\azure-container-dev-book\apps\part3\backend> .\setenv_JAVA_HOME.ps1
PS C:\Users\Hgbfbubtj9tru6j\source\repos\azure-container-dev-book\apps\part3\backend> java --version
openjdk 17.0.13 2024-10-15 LTS
OpenJDK Runtime Environment Corretto-17.0.13.11.1 (build 17.0.13+11-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.13.11.1 (build 17.0.13+11-LTS, mixed mode, sharing)
PS C:\Users\Hgbfbubtj9tru6j\source\repos\azure-container-dev-book\apps\part3\backend>

まとめ

本記事では環境差異吸収のためのJAVA_HOME環境変数設定スクリプトを記しました。

参考にした記事

Discussion