jenv는 다양한 Java 버전을 동시에 관리해야 하는 개발 환경에서 필수적인 도구입니다. 단일 시스템 내에서 여러 Java 버전을 자유롭게 전환함으로써, 레거시 프로젝트와 최신 애플리케이션을 동시에 운영할 수 있는 유연성을 제공합니다. 이 가이드에서는 jenv의 설치부터 고급 활용법까지를 체계적으로 설명합니다.
macOS 및 리눅스에 jenv 설치하기
먼저 Git을 사용해 jenv 저장소를 로컬에 복제합니다:
git clone https://github.com/jenv/jenv.git ~/.jenv
설치 후 쉘 환경 설정 파일에 초기화 스크립트를 추가해야 합니다. zsh 사용자의 경우 ~/.zshrc에 다음 내용을 삽입하세요:
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
설정 완료 후 터미널을 재시작하거나 source ~/.zshrc 명령어로 반영합니다.
기존 JDK 등록 절차
jenv는 JDK 설치 기능을 포함하지 않으므로, 먼저 시스템에 JDK를 설치한 후 이를 등록해야 합니다. macOS에서는 다음 명령어로 Java 홈 경로를 자동 탐지할 수 있습니다:
/usr/libexec/java_home -v 1.8
이 경로를 사용해 jenv에 JDK를 추가합니다:
jenv add /Library/Java/JavaVirtualMachines/jdk-11.0.15.jdk/Contents/Home
등록된 모든 버전은 다음 명령어로 확인 가능합니다:
jenv versions
버전 전환 전략: 세 가지 범위 모드
jenv는 상황에 맞는 세 가지 전환 방식을 지원합니다.
글로벌 기본값 설정
시스템 전체의 기본 Java 버전을 지정합니다:
jenv global openjdk64-17.0.9
이 설정은 새 터미널 세션에서 기본적으로 적용됩니다.
프로젝트별 로컬 설정
특정 프로젝트 폴더에서만 적용되는 버전을 지정하려면:
cd ~/my-java-project
jenv local oracle64-1.8.0.301
이 명령은 현재 디렉터리에 .java-version 파일을 생성하며, 이 파일은 Git을 통해 팀원들과 공유할 수 있습니다.
세션 단위 임시 전환
현재 터미널 창에서만 일시적으로 버전을 변경하려면:
jenv shell adoptopenjdk64-11.0.11
이 설정은 터미널 종료 시 자동으로 해제됩니다.
플러그인으로 기능 확장하기
jenv는 플러그인 아키텍처를 통해 통합 빌드 도구와 연동할 수 있습니다. 대표적인 예는 다음과 같습니다:
- maven: mvn 명령어가 jenv에서 선택한 JDK를 사용하도록 강제합니다.
- gradle: gradle 실행 시 JAVA_HOME을 자동으로 설정합니다.
- export: 환경 변수 동기화를 보장합니다.
플러그인 활성화 방법:
jenv enable-plugin maven
jenv rehash
문제 해결 팁
자바 버전이 바뀌지 않는 경우
다른 SDK 관리 도구(sdkman 등)와 충돌하거나, PATH 설정 순서가 잘못되었을 수 있습니다. jenv 초기화 코드가 다른 자바 관련 설정보다 위에 위치하는지 확인하세요.
JDK 경로 추가 실패 시
자동 탐지를 활용하면 오류를 줄일 수 있습니다:
jenv add "$(/usr/libexec/java_home -v 11)"
전문가를 위한 활용 팁 5선
- 버전 축약 표현:
jenv local 17처럼 메이저 버전만 입력해도 가장 최근 패치 버전을 자동 매칭합니다. - 상세 정보 조회:
jenv which java로 현재 사용 중인 Java 실행 파일의 정확한 경로를 확인할 수 있습니다. - 자동 완성 기능:
completions/jenv.zsh를 설치하면 명령어 입력 시 Tab 키로 자동 완성이 가능합니다. - 훅 스크립트 활용:
~/.jenv/hooks/디렉터리에 커스텀 스크립트를 배치해 버전 전환 시 특정 작업을 자동 실행할 수 있습니다. - 버전 필터링:
jenv versions --bare | grep 11으로 특정 마이너 버전만 추출할 수 있습니다.
jenv는 간결한 CLI 인터페이스와 안정적인 동작으로 Java 생태계에서 입증된 버전 관리 솔루션입니다. 올바르게 설정한다면, 복잡한 다중 Java 환경에서도 매끄러운 개발 경험을 제공합니다.