[자바] 2. 준비 : 여러 자바 버전 설치하고 전환하기 (SDKMAN·JAVA_HOME)

자바 버전 여행 2편 - 여러 자바 버전 설치하고 전환하기

작성자

카테고리:

* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

(자바 버전 여행 ②)

이 시리즈는 편마다 “8에선 이랬는데 17에선 이렇게 바뀌었다”를 계속 비교한다. 그러려면 여러 버전을 오갈 수 있어야 한다. 버전마다 설치 프로그램을 따로 깔고 환경변수를 손으로 바꾸는 건 금방 지친다. 그래서 나는 SDKMAN을 쓴다. 자바 버전을 명령 한 줄로 깔고 바꾸는 도구다. (윈도우는 WSL이나 Git Bash에서 쓰거나, 대안으로 잠깐 뒤에 적는다.)

SDKMAN 설치

macOS·리눅스라면 터미널에 이 두 줄이면 끝이다.

$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"

$ sdk version   # 설치 확인

자바 여러 버전 깔기

설치 가능한 자바 목록을 보고, 원하는 버전을 고른다. 배포판을 안 적으면 기본으로 Temurin 계열이 깔린다.

$ sdk list java          # 설치 가능한 버전·배포판 목록

$ sdk install java 8.0.412-tem
$ sdk install java 11.0.23-tem
$ sdk install java 17.0.10-tem
$ sdk install java 21.0.3-tem

버전 문자열 뒤 -tem이 Temurin이다. -amzn(Corretto), -zulu 등으로 배포판도 고를 수 있다.

버전 오가기 — 이게 핵심

두 가지를 구분하면 된다. 지금 이 터미널에서만 잠깐 바꾸는 use와, 앞으로의 기본값을 바꾸는 default다.

$ sdk use java 8.0.412-tem       # 지금 터미널에서만 8로
$ sdk default java 21.0.3-tem    # 앞으로 기본을 21로

$ java -version                  # 바뀌었는지 확인

JAVA_HOME은 왜 자꾸 나올까

Maven·Gradle·IDE 같은 도구는 “어떤 자바를 쓸지”를 JAVA_HOME이라는 환경변수로 찾는다. 즉 JAVA_HOME이 가리키는 폴더가 곧 ‘지금 자바’다. SDKMAN은 버전을 바꿀 때 이 값을 알아서 갈아 끼워 준다. 지금 값이 궁금하면 이렇게 본다.

$ echo $JAVA_HOME
/Users/cozmo/.sdkman/candidates/java/21.0.3-tem

sdk use로 8로 바꾼 뒤 다시 이 값을 찍어 보면 경로가 8로 바뀌어 있다. 도구가 자바를 못 찾는다고 할 때 십중팔구 이 값이 엉뚱한 걸 가리키고 있다.

직접 해보기 — 8과 21 사이를 왕복하며 확인하기

버전 전환이 실제로 실행에 반영되는지, 현재 버전을 출력하는 작은 프로그램으로 눈으로 확인하자.

  1. SDKMAN으로 자바 8과 21을 둘 다 설치한다.
  2. 아래 Ver.java를 만든다(현재 자바 버전을 출력).
  3. sdk use로 8 → 21 전환하며 각각 실행해, 출력과 JAVA_HOME이 함께 바뀌는지 본다.
// Ver.java
public class Ver {
    public static void main(String[] a) {
        System.out.println(System.getProperty("java.version"));
    }
}

$ sdk use java 8.0.412-tem  && java Ver.java && echo $JAVA_HOME
$ sdk use java 21.0.3-tem   && java Ver.java && echo $JAVA_HOME

실행해 보면 이렇게 나온다.

1.8.0_412
/home/cozmo/.sdkman/candidates/java/8.0.412-tem
21.0.3
/home/cozmo/.sdkman/candidates/java/21.0.3-tem

여기서 조금씩 바꿔 보자.

  • sdk default java 21...로 기본을 고정하고 새 터미널에서 확인한다.
  • IDE(IntelliJ)를 쓴다면 Project SDK에서도 버전을 골라, 빌드가 그 버전으로 도는지 본다.

한 걸음 더 — 자바 8은 버전이 1.8.0으로, 21은 21로 나온다. 왜 8만 1.x 형식인지(옛 버전 표기 규칙) 찾아보자.

✅ 확인 — 한 컴퓨터에서 버전을 명령 한 줄로 바꾸고, JAVA_HOME이 그에 따라 바뀌는 걸 확인했으면 통과다.

배포판 고르기 — 같은 21도 여러 벤더

SDKMAN에서 sdk list java를 치면, 같은 21이라도 Temurin·Corretto·Zulu·GraalVM 등 여러 벤더가 뜬다. 대부분은 Temurin(이클립스 재단, 가장 무난)으로 충분하다. GraalVM은 네이티브 이미지 같은 특수 용도. 벤더는 접미사(-tem, -amzn 등)로 구분한다. 헷갈리면 Temurin을 고르면 된다.

sdk list java              # 벤더·버전 목록
sdk install java 21-tem    # Temurin 21 설치
sdk install java 17-tem

프로젝트마다 자동 전환 — .sdkmanrc

디렉터리마다 다른 버전을 자동으로 쓰게 할 수 있다. 프로젝트 폴더에 .sdkmanrc(java=17-tem)를 두고 sdk env를 켜두면, 그 폴더에 들어갈 때 자동으로 그 버전으로 바뀐다. 여러 프로젝트를 오갈 때 손이 확 준다. (jenv도 비슷한 역할을 한다.)

윈도우라면

SDKMAN은 유닉스 계열이 기본이다. 윈도우에선 WSL이나 Git Bash에서 쓰거나, 대안으로 각 벤더 MSI를 설치한 뒤 시스템 환경변수 JAVA_HOME·Path를 바꾼다. 여러 JDK를 깔고 PowerShell 함수로 전환하는 방법도 있다. 편의로는 WSL + SDKMAN이 제일 낫다.

왜 자꾸 버전이 안 바뀔까 — 3곳 점검

흔한 혼란 하나. java -version은 21인데 빌드는 8을 쓴다면? 세 곳이 따로 놀기 때문이다. ① 셸의 PATH(java 명령이 가리키는 것), ② JAVA_HOME(빌드 도구가 참조), ③ IDE·빌드 파일의 지정 버전(Gradle toolchain, pom의 source/target). 이 셋을 다 맞춰야 진짜 그 버전으로 돈다. ‘터미널 자바’와 ‘빌드 자바’는 다를 수 있다는 걸 기억하자.

이제 여러 버전을 자유롭게 오갈 수 있으니, 본격적으로 1편에서 예고한 여행을 시작한다. 다음 편은 자바 8이 가져온 가장 큰 변화, 람다다. 익명 클래스로 도배하던 코드가 어떻게 반으로 줄어드는지 본다.

자주 묻는 질문 (FAQ)

여러 자바 버전을 한 PC에 깔아도 되나요?

네. SDKMAN이나 jenv로 여러 버전을 설치하고 명령 한 줄로 전환합니다. 프로젝트마다 다른 버전을 쓸 수 있습니다.

도구가 자바를 못 찾는다고 해요.

대개 JAVA_HOME이 엉뚱한 곳을 가리키는 경우입니다. echo $JAVA_HOME으로 확인하고 원하는 버전으로 맞추세요.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다