⛳
【技術覚書】IntelliJ IDEAのCommandターミナルで環境変数JAVA_HOMEを設定する
はじめに
私は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プロンプトでの利用
スクリプトに利用した外部ツール
- Git for Windows付属のsedコマンド
- LiberalArtist/xmllint-win32-x86_64: Platform-specific Racket package providing xmllint.exe for Windows
スクリプト本体
@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