mac jdk 버전별 관리 (adopopenjdk -> Temurin)

최동민·2024년 2월 27일
3

Mac 에서 개발을 하면 대부분 brew 의 openjdk(adoptopenjdk) 를 사용하여 java 를 설치할 것이다.

아무래도 터미널에서 명령어 한 줄이면 설치가 가능하기 때문에 편리한 이유일 것.

그러나 openjdk 에는 1.8 버전 이상부터 설치할 수 있기 때문에 그 이전 버전을 사용하기 위해서는 따로 설치가 필요했다.

adopopenjdk 에서 설치할 수 있는 버전은 brew search jdk 명령어를 통해 확인 가능하다.

에러 트래킹 시작

그런데 나의 경우에는 다음 에러가 발생했다. 같은 이슈를 brew update, brew upgrade를 통해 해결했다는 글을 보고 해당 명령어를 실행했지만 결과가 동일했다.

brew untap AdoptOpenJDK/openjdk 입력 후 다시 실행하니 동작

이제 원하는 jdk를 다운로드 받아보자.

$ brew cask install openjdk{버전}

명령어 입력 방식이 아래와 같이 변경되었다고 한다.
$ brew install --cask adoptopenjdk{버전}

그리고 되는가 싶더니 adoptopenjdk11와 같은 Cask 파일이 없다고 한다.

다음 방식으로 해결이 된다고 하는데 난 실패했다.

Error: Cask 'adoptopenjdk11' definition is invalid: 'appcast' stanza failed with: Calling the `appcast` stanza is disabled! Use the `livecheck` stanza instead.
Please report this issue to the adoptopenjdk/openjdk tap (not Homebrew/brew or Homebrew/homebrew-core), or even better, submit a PR to fix it:
  /opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/adoptopenjdk11.rb:9

설치를 시도하면 기존 패키지와 충돌이 된 듯한 현상이 발생한다.
$ brew install --cask adoptopenjdk/openjdk/adoptopenjdk17

Warning: Cask 'adoptopenjdk17' is unavailable: '/opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/adoptopenjdk17.rb' does not exist.
==> Downloading https://formulae.brew.sh/api/formula.jws.json
###################################################################################################################################################################################################### 100.0%
==> Searching for similarly named casks...
==> Downloading https://formulae.brew.sh/api/cask.jws.json
###################################################################################################################################################################################################### 100.0%
Error: Cask adoptopenjdk8 exists in multiple taps:
       * adoptopenjdk/openjdk/adoptopenjdk8
       * homebrew/cask-versions/adoptopenjdk8

Please use the fully-qualified name (e.g. adoptopenjdk/openjdk/adoptopenjdk8) to refer to a specific Cask.

우선 /opt/homebrew/Library/Taps/homebrew/homebrew-cask-versions/Casks
경로에서 adoptopenjdk8.rb 를 찾아 삭제해주었다.

brew install --cask adoptopenjdk/openjdk/adoptopenjdk 에서 탭을 누르면 다운로드 할 수 있는 목록이 표시된다.

그 중 11버전 다운로드 시도 시 다시 에러 발생.

$ brew install --cask adoptopenjdk/openjdk/adoptopenjdk11

==> Tapping adoptopenjdk/openjdk
Cloning into '/opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk'...
remote: Enumerating objects: 2010, done.
remote: Counting objects: 100% (74/74), done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 2010 (delta 54), reused 63 (delta 45), pack-reused 1936
Receiving objects: 100% (2010/2010), 376.82 KiB | 8.19 MiB/s, done.
Resolving deltas: 100% (1434/1434), done.
Tapped 47 casks (70 files, 535.0KB).
Error: Cask 'adoptopenjdk11' definition is invalid: 'appcast' stanza failed with: Calling the `appcast` stanza is disabled! Use the `livecheck` stanza instead.
Please report this issue to the adoptopenjdk/openjdk tap (not Homebrew/brew or Homebrew/homebrew-core), or even better, submit a PR to fix it:
  /opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/adoptopenjdk11.rb:9

실제 /opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/ 경로를 확인해보니

헷갈리는게 아래 각각의 경로에 jdk 버전 리스트가 있는 것에 대해 이해가 필요해보인다.
/opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/
/opt/homebrew/Library/Taps/homebrew/homebrew-cask-versions/Casks/
adoptopenjdk/openjdk/adoptopenjdk

/opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/
: 경로 설명
이 경로는 adoptopenjdk 탭에 저장된 cask 파일들의 위치를 나타냅니다. adoptopenjdk는 OpenJDK 기반의 JDK를 제공하는 프로젝트입니다. 이 폴더에 있는 cask 파일들은 다양한 버전의 AdoptOpenJDK를 설치하기 위한 설정을 포함합니다.
: 용도
이 경로는 Homebrew를 통해 AdoptOpenJDK 버전을 설치하려는 사용자들에게 JDK 설치 옵션을 제공합니다. 각 cask 파일은 특정 버전의 AdoptOpenJDK를 설치하는 데 필요한 정보(예: 다운로드 URL, 해시 등)를 포함합니다.

/opt/homebrew/Library/Taps/homebrew/homebrew-cask-versions/Casks/
: 경로 설명
이 경로는 homebrew-cask-versions 탭에 저장된 cask 파일들의 위치를 나타냅니다. 이 탭은 기본 homebrew-cask 탭에 포함되지 않은, 다양한 소프트웨어의 추가 버전(예: 베타, 개발, 이전 버전 등)을 제공합니다.
: 용도
사용자가 특정 버전의 소프트웨어(여기서는 JDK 포함)를 필요로 할 때, 기본 cask에서 제공하지 않는 버전을 설치할 수 있는 선택지를 제공합니다. 예를 들어, 특정 버전의 OpenJDK나 Oracle JDK 등을 설치하고 싶을 때 이 탭에서 관련 cask를 찾을 수 있습니다.

adoptopenjdk/openjdk/adoptopenjdk
: 설명
이 표현은 특정 Homebrew 탭과 그 내부의 패키지를 가리킵니다. 여기서 adoptopenjdk/openjdk는 GitHub에서 관리되는 Homebrew 탭의 식별자이며, adoptopenjdk는 그 탭에서 제공하는 특정 패키지(여기서는 AdoptOpenJDK)를 의미합니다.
: 용도
이 명령은 사용자가 AdoptOpenJDK 프로젝트에서 제공하는 JDK를 설치하려고 할 때 사용합니다. Homebrew를 통해 이 탭을 추가하고 패키지를 설치함으로써, 다양한 버전의 AdoptOpenJDK를 쉽게 설치하고 관리할 수 있습니다.

brew install --cask adoptopenjdk 명령어를 사용할 때 Homebrew는 adoptopenjdk cask를 설치하기 위해 첫 번째 경로인
/opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/ 경로에 있는 adoptopenjdk cask 정의 파일을 사용합니다. 이 파일은 AdoptOpenJDK를 설치하는 데 필요한 모든 정보를 담고 있습니다.

따라서 해당 경로에 11버전 명시를 확인하였고 그 버전 설치 시도하였으나 또 다시 실패하였다.
brew install --cask adoptopenjdk11

해당 에러는 adoptopenjdk11 cask 정의 파일에서 appcast stanza(섹션)를 사용하고 있으나, Homebrew에서 이를 사용하는 것이 비활성화되었기 때문에 발생합니다. 대신 livecheck stanza를 사용해야 합니다.

원인 발견

찾아보니 아래 에러를 맞닥뜨리는 이유에 대해 글이 나와있었다.
adoptopenjdk 지원 종료로 Temurin으로 옮긴 것.

Error: Cask 'adoptopenjdk11' definition is invalid: 'appcast' stanza failed with: Calling the `appcast` stanza is disabled! Use the `livecheck` stanza instead.
Please report this issue to the adoptopenjdk/openjdk tap (not Homebrew/brew or Homebrew/homebrew-core), or even better, submit a PR to fix it:
  /opt/homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk/Casks/adoptopenjdk11.rb:9

adoptopenjdk/openjdk tap 이라고 메시지가 뜨는 것을 보니 해당 패키지 저장소에서 이슈 해결을 해줘야 하는 것으로 여겨집니다.
오래전에 Temurin 으로 변경되었으니 Temurin 으로 설치하시면 되세요.
참고 : brew tap [저장소태그] 는 패키지 저장소를 추가, brew untap [저장소태그] 는 패키지 저장소를 삭제하는 명령입니다. 패키지 저장소를 추가하게 되면 Formulae 이외의 저장소에 있는 패키지를 설치할 수 있는 선택지가 늘어나게 됩니다.

해결

  1. 기존 저장소 삭제
    brew untap AdoptOpenJDK/openjdk
  2. temurin 저장소 새 설치 (라스트 버전으로 다운로드)
    brew install --cask temurin
    만약 다른 버전 다운로드를 원한다면
    brew tap homebrew/cask-versions
    brew install --cask temurin8

혹은 웹을 통해 다운로드한다면 설치를 위해 다운로드 페이지(https://adoptium.net/)로 접속. 현재 최신 릴리즈는 21.

Temurin17 (LTS)버전은 jdk-17.0.2버전. 파일명은 OpenJDK17U-jdk_x64_windows_hotspot_17.0.2_8.msi이고, 용량은 160 MB 정도

LTS(Long Term Support)의 뜻은 장기 지원 버전의 의미로 장기간에 걸쳐 업데이터 패치등을 제공한다는 뜻.

$ java -version
openjdk version "21.0.2" 2024-01-16 LTS
OpenJDK Runtime Environment Temurin-21.0.2+13 (build 21.0.2+13-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.2+13 (build 21.0.2+13-LTS, mixed mode)

버전별 관리 방법

brew install jenv를 통해 자바 버전 관리 툴을 brew를 통해 설치

~/.zshrc 에 jenv 관련 설정을 추가
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
이렇게 두개의 명령어를 터미널에서 실행시키시고
적용해주기 source ~/.zshrc

그리고 이제 jenv 에 설치된 자바들을 추가해 주어야 하는데
/Library/Java/JavaVirtualMachines 경로에 갖고 있는 jdk 확인 가능

$ ll      
total 0
drwxr-xr-x  3 root  wheel    96B Apr 22  2021 adoptopenjdk-16.jdk
drwxr-xr-x  3 root  wheel    96B Feb 27 14:41 jdk1.7.0_80.jdk
drwxr-xr-x  3 root  wheel    96B Jan 17 14:06 temurin-21.jdk
drwxr-xr-x  3 root  wheel    96B Jan 18 05:49 temurin-8.jdk

만약 1.7 버전 등 수동 설치를 원하면 아래 링크에서 Mac용 다운로드
https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html

그리고 각자 설치된 버전에 따라 jenv add 명령어를 통해서 설치된 자바의 위치를 입력하여 준다.
/Library/Java/JavaVirtualMachines 경로에서
예시 :
jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

아래와 같이 추가가 된다.

jenv versions : jenv 에 추가된 java 버전별 목록을 확인
업로드중..

만약 전역으로 java 버전을 변경하고 싶다면
jenv global 특정버전
jenv local 특정버전

아래 명령으로 확인 가능
java -version
javac -version

특정 버전의 자바를 jenv 에서 삭제하고 싶다면
jenv remove 특정버전

테스트

17버전으로 변경해보자

17버전 다운로드
brew install --cask temurin17

다운로드 확인

$ ll    
total 0
drwxr-xr-x  3 root  wheel    96B Apr 22  2021 adoptopenjdk-16.jdk
drwxr-xr-x  3 root  wheel    96B Feb 27 14:41 jdk1.7.0_80.jdk
drwxr-xr-x  3 root  wheel    96B Jan 17 11:54 temurin-17.jdk
drwxr-xr-x  3 root  wheel    96B Jan 17 14:06 temurin-21.jdk
drwxr-xr-x  3 root  wheel    96B Jan 18 05:49 temurin-8.jdk

버전 관리 툴에 등록
jenv add /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/

성공 시 아래 입력 표출

temurin64-17.0.10 added
17.0.10 added
17.0 added
 17.0.10 already present, skip installation

jenv global 17.0.10 버전 전역으로 설정 후

jenv versions 확인

  system
  1.7
  1.7.0.80
  17.0
* 17.0.10 (set by /Users/mac/.jenv/version)
  oracle64-1.7.0.80
  temurin64-17.0.10

그러나 javac -version, java -version에는 변경이 안되어있다.

jenv의 export 플러그인 활성화
jenv enable-plugin export

그리고 zshrc에 아까 추가한 jenv init (jenv의 초기화 코드) 설정이 꼭 되어있어야 한다.

설정 완료

mac@2222ui-MacBookPro:/Library/Java/JavaVirtualMachines 
$ java -version            
openjdk version "17.0.10" 2024-01-16
OpenJDK Runtime Environment Temurin-17.0.10+7 (build 17.0.10+7)
OpenJDK 64-Bit Server VM Temurin-17.0.10+7 (build 17.0.10+7, mixed mode)                     
mac@2222ui-MacBookPro:/Library/Java/JavaVirtualMachines 
$ javac -version
javac 17.0.10

내 컴퓨터에 자바가 몇 대 있는지 확인하는 명령어
/usr/libexec/java_home -V

profile
코드를 두드리면 문이 열린다

0개의 댓글