Unable to locate a Java Runtime : M1,M2칩을 사용하는 맥에서 마주한다면 Homebrew로 재설치하여 해결하자..^^

ufw를 설치하려는데 JAVA Runtime을 찾을 수 없다는 에러가 등장했다.

sudo apt install ufw                                                 
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

 

자바 설치 확인 방법

java --version 

java version 명령어로는 확인

java --version
openjdk 21.0.1 2023-10-17
OpenJDK Runtime Environment (build 21.0.1+12-29)
OpenJDK 64-Bit Server VM (build 21.0.1+12-29, mixed mode, sharing)

 

echo $JAVA_HOME

은 아무것도 출력되지 않았다. 분명 환경변수와 bin을 이용하여 영구적 설정을 해줬음에도...

 

JavaVirtualMachines

cd /Library/Java/JavaVirtualMachines

으로 이동하여 ls 명령어를 확인하면 자바가 설치된 경로가 나오는데, 나의 경우 아무것도 출력되지 않았다. 


자바 환경변수 설정

1. /usr/libexec/java_home

/usr/libexec/java_home 으로 java 가 설치된 위치를 확인해준다.

/Users/jeonghye/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home

 

 

2. export JAVA_HOME

반환한 경로를 JAVA_HOME으로 설정해준다.

export JAVA_HOME=/Users/jeonghye/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home

 

 

2-1) 영구 설정

영구적으로 JAVA_HOME 을설정하려면 ~/.bash_profile 에 추가 설정이 필요하다

(사용하는 bash/zsh 쉘에 따라 ~/.zshrc 파일을 설정할지 ~/.bash 를 설정할지 선택)

echo 'export JAVA_HOME=/Users/jeonghye/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home' >> ~/.bash_profile
source ~/.bash_profile
echo 'export JAVA_HOME=/Users/jeonghye/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home' >> ~/.zshrc
source ~/.zshrc

나는 평소에 당연히 bash 를 사용한다고 생각했는데 터미널을 보니까 ~zsh 가 떠있었다. shell 에 대해 찾아보니 bash 와 zsh 는 약간의 편리함 정도일 뿐 큰 차이가 없다고 한다. 

 

참고 : echo $SHELL 명령어로 자신이 무슨 shell을 사용하는지 알 수 있다. 

echo $SHELL
/bin/zsh

 

 

3. echo $JAVA_HOME

명령어로 환경변수가 올바르게 설정되었는지 확인해본다. 

echo $JAVA_HOME

/Users/jeonghye/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home
➜  ~ echo 'export JAVA_HOME=/Users/jeonghye/Library/Java/JavaVirtualMachines/openjdk-21.0.1/Contents/Home' >> ~/.zshrc

 


보통 여기까지 해주면 해결된다고 하는데, 나는 여전히 Unable to locate a Java Runtime 이 떴다

sudo apt install ufw
Password:
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java

 

재부팅 이후 시도해본 것들

echo $JAVA_HOME

명령어는 올바른 경로 출력되나 install 은 여전히 되지 않음

/usr/libexec/java_home -V

이 명령어로도 환경변수가 확인이 되었다. 

 


자바 라이선스 문제

찾아보니 맥북 중에서 M1, M2 칩을 사용하는 맥북은 OpenJDk 또는 자바를 설치하려고 할 때 에러를 마주할 수 있다고 한다, 기존 자바와 OpenJDK 를 삭제하고 Homebrew를 통해 설치하면 해결된다고 한다.

 

https://whoishoo.tistory.com/693

 

[Error Code] The operation couldn’t be completed. Unable to locate a Java Runtime. Please visit http://www.java.com for inform

The operation couldn’t be completed. Unable to locate a Java Runtime. Please visit http://www.java.com for information on installing Java. # Java installation error 자바가 라이선스에 대한 기준과 규정들이 복잡해지면서 공부하는

whoishoo.tistory.com

 

자바 재설치

brew uninstall openjdk

를 시도하였으나 

➜  ~ brew uninstall openjdk

Error: Refusing to uninstall /opt/homebrew/Cellar/openjdk/22.0.1
because it is required by h2, which is currently installed.
You can override this and force removal with:
  brew uninstall --ignore-dependencies openjdk
==> Autoremoving 1 unneeded formula:
pygments

 

이렇게 H2때문에 uninstall 명령어도 실행되지 않았다. H2가 JAVA에 의존되어있으니 JAVA를 제거하면 문제가 발생할 수 있다고 생각했다. 그렇지만 재설치 후 환경변수만 제대로 설정한다면 큰 문제는 없을 것 으로 생각되었다. 

 

그러면 두 가지 선택지가 놓이게 되는데,

  • openjdk를 제거한 뒤, 의존성 패키지(h2)는 제거하지 않는 경우
brew uninstall --ignore-dependencies openjdk
  • h2 패키지 제거 후 openjdk 제거 : brew uninstall h2
brew uninstall h2
brew uninstall openjdk

 

중 어차피 의존성 패키지만 살리겠다고 하다가 또 h2로 고생할 것 같았기에 그냥 뒤에 명령어를 택했다.

 

brew uninstall

h2 제거는 제대로 되었으나,  brew uninstall openjdk를 입력했을 때 

Error: No such keg: /opt/homebrew/Cellar/openjdk

가 출력되었다. 이는JAVA가 homebrew를 통해 설치된 것이 아니라 이렇게 뜬 것이라고 한다.

(당연함 애초에 homebrew로 설치하지 않았기에 발생하는 문제들을 마주하고 있었음) 

하지만 brew search openjdk명령어에서는 jdk가 확인되었기에 약간의 혼란스러움을 겪었다. 정확한 진단을 위해

 

brew list

brew list 명령어를 사용하여 home brew 로 설치된 목록을 살펴보았다. 여기에서JDK를 찾아볼 수 없었다.

brew search 명령어는 brew로 설치되든, 그렇지 않든 프로그램을 찾는 용도인 것 같았다.

 

 

rm -rf

brew uninstall 명령으로는 jdk를 제거할 수 없었다. 따라서 rm -rf 로 직접 경로를 입력해 제거해주었다.

/usr/libexec/java_home -V를 확인하여 정확한 경로 확인 후 , 

rm -rf /Users/jeonghye/Library/Java/JavaVirtualMachines/openjdk-21.0.1

이렇게 강제 삭제 해주었다. 

삭제하기 이전에 환경변수를 정리하고 싶었는데, 그냥 재설정 하면 되는 부분이라 생각하여 굳이 제거하지 않고 brew를 이용해 재설치했다.

 

brew install openjdk

For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

openjdk is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS provides similar software and installing this software in
parallel can cause all kinds of trouble.

If you need to have openjdk first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk you may need to set:
  export CPPFLAGS="-I/opt/homebrew/opt/openjdk/include"

brew 로 install이 완료되면 이런 메세지가 뜨는데, 이는 jdk는 설치되었으나 심볼릭 링크가 설정되지 않았음을 의미한다고 한다.

(추가 세팅에 대한 얘기이며 이 때 java -version을 확인했을 때는 찾을 수 없다고 뜸)

심볼릭 링크 설정을 위해 제시해준 명령어를 입력했다. 추가로 (나의 경우) 이미 이전 설치된 JDK에 대한 환경변수가 설정되어 있었기에 sudo ln -sfn 를 이용해 다시 입력해주었다.

 

export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"
export CPPFLAGS="-I/opt/homebrew/opt/openjdk/include"
sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

 

 

환경변수 확인

nano ~/.zshrc

 

를 이용해 환경변수가 제대로 입력되어있는지 확인한다. 맨 밑에 

#JAVA
export JAVA_HOME=/opt/homebrew/opt/openjdk/libexec/openjdk.jdk/Contents/Home
export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"
export CPPFLAGS="-I/opt/homebrew/opt/openjdk/include"

 

가 추가되어있으면 정상적으로 적용된 것이며, 없거나 다른 경우 위의 세 줄을 추가해주면 된다. 

수정이 된 것을 확인하면 ctrl +O(저장) , ctrl+X(종료) 를 이용하여 nano편집기에서 빠져나온다.

source ~/.zshrc

명령어로 파일 update

 

 

이후 java -version 을 확인해보면 정상출력된다. 안 되는 경우 cmd창을 껐다 켜서 새로운 셀로 확인해보자 !

java -version

openjdk version "22.0.1" 2024-04-16
OpenJDK Runtime Environment Homebrew (build 22.0.1)
OpenJDK 64-Bit Server VM Homebrew (build 22.0.1, mixed mode, sharing)