[Linux] JDK 여러 버전 적용하기, 여러개의 패키지 관리하기 (update-alternatives)

1. 문제 상황

JDK21을 서버에 적용하면서, 기존 버전과 동시에 사용해야 하는 상황 발생

2. 해결

물론 빌드할 때마다 자바 홈 경로를 바꿔서 적용하거나, 각 톰캣의 catalina.sh에 

echo JAVA_HOME=개별 JAVA경로

혹은 startup.sh 스크립트 상단에 개별 JAVA_HOME을 명시하는 방법도 있지만, 심볼릭 링크를 통해 여러 패키지를 관리하는 방식인 update-alternatives 를 통해 적용하였다.

 

개념은 심볼릭링크 (상세 내용은 아래 링크 참고)

2023.10.09 - [Linux] - [Linux] 심볼릭 링크 (Symbolic link) 설정하기

 

[Linux] 심볼릭 링크 (Symbolic link) 설정하기

1. 심볼릭 링크 (Symbolic link)란? 링크를 걸어 원본 파일을 직접 사용하는 것과 같은 효과를 낸다. 특정 폴더에 링크를 걸어 NAS, library 원본 파일을 사용하거나 톰캣 빌듯이 상위경로의 파일을 사용

junhkang.tistory.com

를 설정 후에 필요한 시점에 해당 심볼릭 링크에 연결된 링크를 선택하여 사용하는 방법이다.

 

2-1. update-alternatives 설정 확인

 update-alternatives --list

를 통해 현재 java에 매핑된 경로를 확인해 보자

현재 jdk21 버전을 보고 있고, 여기에 다른 버전의 jdk를 추가한 후 그때그때 선택할 수 있도록 수정해 보겠다.

 

2-2. 다른 버전의 jdk 경로 등록

1.8 버전의 jdk를 추가하고 싶다면 다음과 같이 /etc/alternatives/java의 심볼릭 링크에 신규 버전의 java 경로를 등록해 주면 된다.

update-alternatives --install /etc/alternatives/java java /lib/jvm/jdk-21/java/bin 1
update-alternatives --install /etc/alternatives/java java /lib/jvm/java-1.8.0-openjdk/java/bin 2

맨뒤의 숫자 1, 2는 우선순위로, 여러 개의 링크가 등록될 경우 디폴트 값을 정의하며 숫자가 높을수록 우선순위가 높다. 

(현재 스크립트상으로는 jdk1.8이 기본 링크로 설정되어 있다.)

 

혹시 잘못된 경로를 등록하였다면 --remove를 통해 삭제가 가능하다.

update-alternatives --remove java /lib/jvm/jdk-21/java/bin

2-3. 링크 정상 등록 확인

update-alternatives --config java

두 옵션 중 한 가지를 선택한 후 java -version을 확인해 보면 선택한 jdk 경로로 정상 변경된 것을 확인할 수 있다.

2-4.  java -version이 안될 경우 (java 경로를 못 찾을 경우)

/etc/alternatives/java 경로에 심볼릭 링크를 연결하였기에 자바 경로를 해당 경로와 맞춰주어야 한다.

vi /etc/bashrc

 스크립트에 java, javac에 해당하는 alias를 등록

alias java="/etc/alternatives/java"
alias javac="/etc/alternatives/javac"

bashrc 적용

source /etc/bashrc

java -version을 입력할 시 정상적으로 선택한 java 경로를 찾아가게 된다.

 

3. 결론

실제 운영서버는 jdk버전을 통일할 것이기에 상관없지만, jdk를 여러버전 써야 하는 서버의 경우 매번 alternatives 옵션으로 선택을 하는 것이 과연 효율적 일지, 배포 시 실수로 이어지기 쉬운 작업은 아닌지 고려해봐야할 듯하다. alternatives를 배포시 자동으로 설정하는 스크립트를 생성하여 alias를 생성하던지, 최초 언급했던 대로 자바 환경변수 설정자체를 톰캣별 스크립트에 설정하는 것도 고려해 보아야겠다. (운영 과정에서 더 나은 방법이나 변경되는 내용이 있다면 내용 추가 예정)