본문 바로가기
IT/리눅스

Java 여러 버전 설치, 관리하기 (update-alternatives)

by 라떼야가자 2024. 8. 4.

리눅스에서 톰캣과 같은 WAS를 사용하거나 스프링(Spring) 등 자바로 설치한 프로그램을 배포할 때, 서버에 설치되어 있는 자바와 개발에 사용한 자바의 버전이 다른 경우가 있다.

 

이때, 필요한 자바 버전을 따로 설치하고 JAVA_HOME 변수와 PATH를 지정하여 사용해도 되지만, 조금 더 시스템적으로 관리할 수 있는 방법인 update-alternatives 명령어를 사용하는 방법을 소개한다.

 

 

이번 예제에서는 JDK1.8이 설치되어 있는 리눅스에 JDK17을 설치하여 설정하는 순서로 진행한다.

 

1. OpenJDK 17 설치

$ sudo yum install java-17-openjdk-devel

 

2. 현재 자바 버전 확인

위에서 OpenJDK 17을 설치했지만 java -version 결과는 아직 1.8 버전으로 확인된다.

$ java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)

 

3. 자바 경로 확인

$ which java
/usr/bin/java

 

4. 실제 자바 경로 확인

실제 경로를 확인해 보면 자바 17 버전을 설치 후에도 /usr/bin/java는 여전히 자바 1.8로 연결되어 있는 것을 알 수 있다.

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-2.el8.x86_64/jre/bin/java

 

 

5. update-alternatives 명령어를 이용해서 자바 버전을 변경한다.

update-alternatives --config java 를 입력하면 현재 OS에 설치되어 있는 리눅스의 목록이 숫자와 함께 표시되며, 사용할 버전의 숫자를 키보드로 입력한다.

$ update-alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-2.el8.x86_64/jre/bin/java)
   2           java-17-openjdk.x86_64 (/usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el8.x86_64/bin/java)

Enter to keep the current selection[+], or type selection number: 2

 

6. 변경된 자바 버전 확인

이제 다시 java -version 명령어를 사용하면 버전이 17로 변경된 것을 확인할 수 있다.

 java -version
openjdk version "17.0.11" 2024-04-16 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.11.0.9-3) (build 17.0.11+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.11.0.9-3) (build 17.0.11+9-LTS, mixed mode, sharing)

 

7. 변경된 자바 경로 확인

위에서 했던 것과 마찬가지로 자바의 경로를 다시 한 번 확인해 보면 17 버전으로 변경되어 있다.

$ which java
/usr/bin/java
$
$ readlink -f /usr/bin/java
/usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el8.x86_64/bin/java

 

이렇게 update-alternatives 명령어를 사용하면 시스템 전역으로 자바의 버전이 변경되기 때문에, 특정 톰캣 등에서의 개별 설정으로 인해 유지보수에 혼란이 오는 경우를 방지할 수 있다.

 

 

 

추가적으로, 자바 버전에 따라 JAVA_HOME 변수도 같이 변경해야 할 일이 종종 있을 수 있는데, 이때 다른 프로그램에서 쉽게 적용할 수 있는 스크립트이다.

$ JAVA_HOME=$(java -XshowSettings:properties -version 2>&1 |grep java.home | awk -F= '{print $2}')

 

여기서 사용되는 java -XshowSettings:properties -version 명령어는 설치된 java 버전에 관한 자세한 속성들을 출력하는 명령어이다.

$ java -XshowSettings:properties -version
Property settings:
    file.encoding = UTF-8
    file.separator = /
    java.class.path =
    java.class.version = 61.0
    java.home = /usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el8.x86_64
    java.io.tmpdir = /tmp
    java.library.path = /usr/java/packages/lib
        /usr/lib64
        /lib64
        /lib
        /usr/lib
    java.runtime.name = OpenJDK Runtime Environment
    java.runtime.version = 17.0.11+9-LTS
    java.specification.name = Java Platform API Specification
    java.specification.vendor = Oracle Corporation
    java.specification.version = 17
    java.vendor = Red Hat, Inc.
    java.vendor.url = https://www.redhat.com/
    java.vendor.url.bug = https://access.redhat.com/support/cases/
    java.vendor.version = (Red_Hat-17.0.11.0.9-3)
    java.version = 17.0.11
    java.version.date = 2024-04-16
    java.vm.compressedOopsMode = 32-bit
    java.vm.info = mixed mode, sharing
    java.vm.name = OpenJDK 64-Bit Server VM
    java.vm.specification.name = Java Virtual Machine Specification
    java.vm.specification.vendor = Oracle Corporation
    java.vm.specification.version = 17
    java.vm.vendor = Red Hat, Inc.
    java.vm.version = 17.0.11+9-LTS
    jdk.debug = release
    line.separator = \n
    native.encoding = UTF-8
    os.arch = amd64
    os.name = Linux
    os.version = 4.18.0-553.5.1.el8_10.x86_64
    path.separator = :
    sun.arch.data.model = 64
    sun.boot.library.path = /usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el8.x86_64/lib
    sun.cpu.endian = little
    sun.io.unicode.encoding = UnicodeLittle
    sun.java.launcher = SUN_STANDARD
    sun.jnu.encoding = UTF-8
    sun.management.compiler = HotSpot 64-Bit Tiered Compilers
    sun.stderr.encoding = UTF-8
    sun.stdout.encoding = UTF-8
    user.country = US
    user.dir = /root
    user.home = /root
    user.language = en
    user.name = root

openjdk version "17.0.11" 2024-04-16 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.11.0.9-3) (build 17.0.11+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.11.0.9-3) (build 17.0.11+9-LTS, mixed mode, sharing)