Post

brew cleanup 후 java_home이 엉뚱한 버전을 반환할 때

Homebrew가 옛 JDK를 삭제하면 /Library/Java/JavaVirtualMachines 심볼릭 링크가 깨진다

brew cleanup 후 java_home이 엉뚱한 버전을 반환할 때

Homebrew로 openjdk@21을 설치하고 brew cleanup을 돌린 다음 /usr/libexec/java_home -v 21이 17을 반환하거나, jenv local 21version '21' not installed로 거절하는 일이 있다. 설치는 멀쩡한데 시스템 심볼릭 링크가 깨진 상태다.

증상

1
2
3
4
5
/usr/libexec/java_home -v 21
# → 17 경로를 반환하거나 에러

jenv local 21
# → jenv: version `21' not installed

원인

Homebrew가 openjdk@21을 마이너 업데이트하면 이전 버전이 Cellar/ 아래에 남는다. 그 다음 brew cleanup이 이전 버전을 삭제하는데, 그 사이에 만들어둔:

1
2
/Library/Java/JavaVirtualMachines/openjdk-21.jdk
  → /opt/homebrew/Cellar/openjdk@21/<옛 버전>/...

심볼릭 링크가 삭제된 경로를 그대로 가리키게 된다. JDK 자체는 새 버전이 설치돼 있지만, java_home은 이 심볼릭 링크를 따라가서 깨진 위치를 본다.

해결: 심볼릭 링크 갱신

설치된 버전 경로 확인 후 ln -sfn으로 강제 재생성:

1
2
3
4
5
6
7
8
9
ls /opt/homebrew/Cellar/openjdk@21/
# 21.0.10  ← 실제 설치된 버전

sudo ln -sfn /opt/homebrew/Cellar/openjdk@21/21.0.10/libexec/openjdk.jdk \
  /Library/Java/JavaVirtualMachines/openjdk-21.jdk

# 확인
/usr/libexec/java_home -V
# 21이 정상 경로로 잡혀야 함

jenv vs java_home

도구보는 곳
jenv versions~/.jenv/versions/ 디렉토리에 등록된 버전
/usr/libexec/java_home/Library/Java/JavaVirtualMachines/의 plist 메타데이터

둘은 별개 시스템이라 jenv versions에 21이 보이는데 java_home은 못 찾는 상황이 가능하다. jenv가 보여주는 건 jenv 등록 상태, java_home이 보여주는 건 시스템 설치 상태.

심볼릭 링크가 깨진 게 후자(java_home)인 상황이고, 위 명령으로 시스템 설치를 복구하면 둘 다 정상 작동한다.

핵심 정리

brew cleanup 후 Java가 이상하다 → /Library/Java/JavaVirtualMachines/ 심볼릭 링크 확인. sudo ln -sfn으로 살아있는 Cellar 경로로 다시 묶으면 끝.

This post is licensed under CC BY 4.0 by the author.