1. 문제 상황
JDK21을 서버에 적용하면서, 기존 버전과 동시에 사용해야 하는 상황 발생
2. 해결
물론 빌드할 때마다 자바 홈 경로를 바꿔서 적용하거나, 각 톰캣의 catalina.sh에
echo JAVA_HOME=개별 JAVA경로
혹은 startup.sh 스크립트 상단에 개별 JAVA_HOME을 명시하는 방법도 있지만, 심볼릭 링크를 통해 여러 패키지를 관리하는 방식인 update-alternatives를 통해 적용하였다.
개념은 심볼릭링크 (상세 내용은 아래 링크 참고)
[Linux] - [Linux] 심볼릭 링크 (Symbolic link) 설정하기
를 설정 후에 필요한 시점에 해당 심볼릭 링크에 연결된 링크를 선택하여 사용하는 방법이다.
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를 생성하던지, 최초 언급했던 대로 자바 환경변수 설정자체를 톰캣별 스크립트에 설정하는 것도 고려해 보아야겠다. (운영 과정에서 더 나은 방법이나 변경되는 내용이 있다면 내용 추가 예정)