본문으로 바로가기

목차

    0. 설치 전 확인

    - alternatives의 기본적인 소개와 세팅 진행 전 확인해야 될 부분입니다. 

    0.1. alternatives 소개

    [alternatives]

    : 심볼릭 링크 그룹을 생성, 제거, 관리, 조회할 수 있는 기능을 제공하는 툴

    : 서버 관리 및 프로젝트 관리를 하다 보면 경우에 따라 여러 가지 버전의 Java(jdk)를 관리해야 할 필요가 있는데 이럴 경우 관리를 하는데 매우 도움이 됩니다.

    : alternatives (레드햇), update-alternatives (데비안)으로 OS에 따라 명령어가 다릅니다.

     

    [alternatives 기본 명령어]

    1. 전체 링크 그룹에 대한 정보를 표시

    # alternatives --list name

     

    2. alternatives에 심볼릭 링크 그룹 등록

    # alternatives --install link name path priority [--slave link name path]...  [--initscript service] [--family name]

    --slave를 이용해 부수적인 명령어도 같이 관리할 때 사용합니다. (--slave 옵션은 여러 번 정의할 수 있습니다.)

    EX) java, javac, javadoc 등 한 번에 등록해서 관리가 가능합니다.

     

    3. alternatives에 등록한 심볼릭 링크 그룹 삭제

    # alternatives --remove name path

     

    4. 심볼릭 링크 그룹 정보 표시 (

    # alternatives --display name

     

    5. 심볼릭 링크 그룹 마스터 선택 (사용할 버전 선택)

    # alternatives --config name

     

    link: 심볼릭 링크의 경로, ln -s로 생성한 심볼릭 링크 경로
    name: alternatives 에서 관리할 심볼릭 링크 그룹명
    path: 패키지의 절대 경로
    priority: 링크 그룹 내에서 우선순위, 정수로 입력하고 클수록 우선순위가 높습니다.

     

    [alternatives 관련 디렉터리]

    /etc/alternatives/<name>

    : 링크 그룹이 생성되는 디렉터리

    /var/lib/alternatives/<name>

    : 링크 그룹의 메타 데이터(mode, priority, link, path)에 대한 정보를 저장하는 디렉터리

     

    ★더 자세한 내용은 man alternatives를 이용해 확인해주세요.

    0.2. 여러 버전의 Java(jdk) 설치

    - 실습으로 하는 경우 여러 버전의 Java(jdk) 파일을 미리 설치해 둡니다.

      (필자는 openjdk 15.0.2, 14.0.2를 /usr/local/lib에 wget으로 설치했습니다.)

     

    Archived OpenJDK GA Releases

    Archived OpenJDK General-Availability Releases This page is an archive of previously released builds of the JDK licensed under the GNU General Public License, version 2, with Classpath Exception. WARNING: These older versions of the JDK are provided to he

    jdk.java.net

    0.3. 기존 파일 제거

    - CentOS7을 설치한 경우 기본적으로 JDK도 설치되어 있고 alternatives에 기본적으로 심볼릭 링크가 등록이 되어 있습니다. 등록된 심볼릭 링크를 제거 후 세팅 작업을 진행합니다.

     

    - 기존에 등록된 Java 심볼릭 링크 그룹이 있는지 조회해 봅니다.

    1. 전체 심볼릭 링크 그룹 확인
    alternatives --list
    
    # alternatives --list
    libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
    ld      auto    /usr/bin/ld.bfd
    mkisofs auto    /usr/bin/genisoimage
    cdrecord        auto    /usr/bin/wodim
    nmap    auto    /usr/bin/ncat
    cdda2wav        auto    /usr/bin/icedax
    xinputrc        auto    /etc/X11/xinit/xinput.d/ibus.conf
    java    auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java
    jre_openjdk     auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre
    jre_1.8.0       auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre
    jre_1.8.0_openjdk       auto    /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64
    print   auto    /usr/bin/lpr.cups
    libjavaplugin.so.x86_64 auto    /usr/lib64/IcedTeaPlugin.so
    mta     auto    /usr/sbin/sendmail.postfix
    cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
    libwbclient.so.0.15-64  auto    /usr/lib64/samba/wbclient/libwbclient.so.0.15

     

    - 기존 java가 등록되어 있으면 위에서 조회한 심볼릭 링크 그룹명과 패키지의 절대 경로를 사용해 다음 명령어로 등록된 심볼릭 링크를 제거해 줍니다.

    1. 심볼릭 링크 제거
    alternatives --remove <name> <path>
    name: alternatives 에서 관리하는 심볼릭 링크 그룹명
    path: 패키지의 절대 경로
    
    # alternatives --remove java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java

     

    - 제거가 잘 되었는지 확인을 위해 한 번 더 조회해 봅니다.

    # alternatives --list
    libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
    ld      auto    /usr/bin/ld.bfd
    mkisofs auto    /usr/bin/genisoimage
    cdrecord        auto    /usr/bin/wodim
    nmap    auto    /usr/bin/ncat
    cdda2wav        auto    /usr/bin/icedax
    xinputrc        auto    /etc/X11/xinit/xinput.d/ibus.conf
    jre_openjdk     auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre
    jre_1.8.0       auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre
    jre_1.8.0_openjdk       auto    /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64
    print   auto    /usr/bin/lpr.cups
    libjavaplugin.so.x86_64 auto    /usr/lib64/IcedTeaPlugin.so
    mta     auto    /usr/sbin/sendmail.postfix
    cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
    libwbclient.so.0.15-64  auto    /usr/lib64/samba/wbclient/libwbclient.so.0.15

     


    1. 설정

    - 필자의 Java(Jdk) 설치경로가 다음과 같습니다. (필자는 두 버전을 이용해 세팅합니다.)

      /usr/local/lib/jdk-14.0.2, /usr/local/lib/jdk-15.0.2

      (관리를 위해 리눅스 디렉터리 용도에 맞게 관리를 위해 java(jdk)를 /usr/local/lib에 설치했습니다.)

    # ll
    합계 33136
    drwxr-xr-x.  8 root root       96  7월 21 12:49 jdk-14.0.2
    drwxr-xr-x.  8 root root       96  7월 21 12:49 jdk-15.0.2
    -rwxr-xr-x.  1 root root 33917232  7월 12 22:05 libpython3.9.a
    drwxr-xr-x.  2 root root       54  7월 12 22:07 pkgconfig
    drwxr-xr-x. 36 root root     8192  7월 12 22:07 python3.9

    1.1. 심볼릭 링크 생성(ln)

    - alternatives 설정을 위해 설정할 여러 버전의 자바 심볼릭 링크를 생성해 줍니다.

    (관리를 위해 리눅스 디렉터리 용도에 맞게 관리를 위해 심볼릭 링크를 /usr/local/bin에 생성했습니다.)

    ★ 하나의 Java(jdk) 대상으로만 심볼릭 링크를 생성하면 됩니다. → openjdk 14.0.2 심볼릭 링크 생성

    1. 심볼릭 링크 생성 (ln -s 원본파일 링크파일)
    (환경변수를 위한 심볼링 링크, java 실행을 위한 심볼릭 링크, javac 실행을 위한 심볼릭 링크를 생성)
    
    # ln -s /usr/local/lib/jdk-14.0.2 /usr/local/bin/java_home
    # ln -s /usr/local/lib/jdk-14.0.2/bin/java /usr/local/bin/java
    # ln -s /usr/local/lib/jdk-14.0.2/bin/javac /usr/local/bin/javac
    
    2. ll 명령어를 이용해 해당 경로에 심볼릭 링크가 정확한 경로에 잘 생성되었는지 확인
    
    # ll
    합계 17484
    -rwxr-xr-x. 1 root root      101  7월 12 22:07 2to3-3.9
    -rwxr-xr-x. 1 root root       99  7월 12 22:07 idle3.9
    lrwxrwxrwx. 1 root root       34  7월 21 12:58 java -> /usr/local/lib/jdk-14.0.2/bin/java
    lrwxrwxrwx. 1 root root       25  7월 21 12:58 java_home -> /usr/local/lib/jdk-14.0.2
    lrwxrwxrwx. 1 root root       35  7월 21 12:58 javac -> /usr/local/lib/jdk-14.0.2/bin/javac
    -rwxr-xr-x. 1 root root      229  7월 12 22:07 pip3.9
    -rwxr-xr-x. 1 root root       84  7월 12 22:07 pydoc3.9
    -rwxr-xr-x. 1 root root 17879896  7월 12 22:05 python3.9
    -rwxr-xr-x. 1 root root     3087  7월 12 22:07 python3.9-config

    1.2. 심볼릭 링크 그룹 생성(alternatives)

    - alternatives --install 명령어를 이용해 심볼릭 링크 그룹을 생성 후 명령어 llalternatives --list를 이용해 확인해 줍니다. → openjdk 14.0.2 심볼릭 링크 그룹 생성

    1. 환경변수 그리고 --slave를 이용해 java, javac 명령어도 등록해 줍니다.
    # alternatives --install /usr/local/bin/java_home java_home /usr/local/lib/jdk-14.0.2 2 --slave /usr/local/bin/java java /usr/local/lib/jdk-14.0.2/bin/java --slave /usr/local/bin/javac javac /usr/local/lib/jdk-14.0.2/bin/javac
    
    2. 해당 심볼릭 링크가 새로 생성된 심볼릭 링크 그룹을 잘 바라보고 있는 지 확인해 줍니다.
    # ll
    합계 17484
    -rwxr-xr-x. 1 root root      101  7월 12 22:07 2to3-3.9
    -rwxr-xr-x. 1 root root       99  7월 12 22:07 idle3.9
    lrwxrwxrwx. 1 root root       22  7월 21 13:06 java -> /etc/alternatives/java
    lrwxrwxrwx. 1 root root       27  7월 21 13:06 java_home -> /etc/alternatives/java_home
    lrwxrwxrwx. 1 root root       23  7월 21 13:06 javac -> /etc/alternatives/javac
    -rwxr-xr-x. 1 root root      229  7월 12 22:07 pip3.9
    -rwxr-xr-x. 1 root root       84  7월 12 22:07 pydoc3.9
    -rwxr-xr-x. 1 root root 17879896  7월 12 22:05 python3.9
    -rwxr-xr-x. 1 root root     3087  7월 12 22:07 python3.9-config
    
    3. alternatives --list 명령어를 이용해 잘 생성이 되었는지 확인해 줍니다.
    # alternatives --list
    libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
    ld      auto    /usr/bin/ld.bfd
    mkisofs auto    /usr/bin/genisoimage
    cdrecord        auto    /usr/bin/wodim
    nmap    auto    /usr/bin/ncat
    cdda2wav        auto    /usr/bin/icedax
    xinputrc        auto    /etc/X11/xinit/xinput.d/ibus.conf
    jre_openjdk     auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre
    jre_1.8.0       auto    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre
    jre_1.8.0_openjdk       auto    /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64
    print   auto    /usr/bin/lpr.cups
    libjavaplugin.so.x86_64 auto    /usr/lib64/IcedTeaPlugin.so
    mta     auto    /usr/sbin/sendmail.postfix
    cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
    libwbclient.so.0.15-64  auto    /usr/lib64/samba/wbclient/libwbclient.so.0.15
    java_home       auto    /usr/local/lib/jdk-14.0.2
    
    4. 해당 디렉터리에 잘 생성이 되었는지 확인해 봅니다.
    # ll /etc/alternatives/java_home
    lrwxrwxrwx. 1 root root 25  7월 21 13:13 /etc/alternatives/java_home -> /usr/local/lib/jdk-14.0.2
    # ll /var/lib/alternatives/java_home
    -rw-r--r--. 1 root root 281  7월 21 13:13 /var/lib/alternatives/java_home

    - 추가적으로 그룹으로 함께 관리할 Java(jdk)도 생성해 줍니다. → openjdk 15.0.2 심볼릭 링크 그룹 생성

    # alternatives --install /usr/local/bin/java_home java_home /usr/local/lib/jdk-15.0.2 1 --slave /usr/local/bin/java java /usr/local/lib/jdk-15.0.2/bin/java --slave /usr/local/bin/javac javac /usr/local/lib/jdk-15.0.2/bin/javac

    1.3. 심볼릭 링크 그룹 생성 확인(alternatives)

    - 위에서 생성한 그룹이 잘 생성되었는지 확인합니다.

    1. alternatives --display name
    # alternatives --display java_home
    java_home - 상태가 자동입니다.
    현재 /usr/local/lib/jdk-14.0.2로 링크되어 있습니다
    /usr/local/lib/jdk-14.0.2 - priority 2
     슬레이브 java: /usr/local/lib/jdk-14.0.2/bin/java
     슬레이브 javac: /usr/local/lib/jdk-14.0.2/bin/javac
    /usr/local/lib/jdk-15.0.2 - priority 1
     슬레이브 java: /usr/local/lib/jdk-15.0.2/bin/java
     슬레이브 javac: /usr/local/lib/jdk-15.0.2/bin/javac
    현재 '최고' 버전은 /usr/local/lib/jdk-14.0.2입니다.

     

    - cat명령어를 이용해 설정한 메타데이터도 직접 확인해 볼 수 있습니다.

    # cat /var/lib/alternatives/java_home
    auto
    /usr/local/bin/java_home
    java
    /usr/local/bin/java
    javac
    /usr/local/bin/javac
    
    /usr/local/lib/jdk-14.0.2
    2
    /usr/local/lib/jdk-14.0.2/bin/java
    /usr/local/lib/jdk-14.0.2/bin/javac
    /usr/local/lib/jdk-15.0.2
    1
    /usr/local/lib/jdk-15.0.2/bin/java
    /usr/local/lib/jdk-15.0.2/bin/javac

    1.4. 심볼릭 링크 파일 환경 변수 등록

    - Java(jdk) 환경 변수를 등록합니다. /usr/local/bin/java_home 심볼릭 링크를 Java(jdk) 환경 변수로 등록하면 alternatives명령어를 이용해 간단하게 필요시에 다양한 버전의 환경 변수를 변경해서 사용할 수 있습니다.

    1. vi로 파일 편집
    # vi /etc/profile
    
    2. 작성내용 (Shift + G로 파일 맨 끝에 작성해 줍니다.)
    export JAVA_HOME=/usr/local/bin/java_home
    
    3. 파일 적용(저장)
    # source /etc/profile

     


    2. 버전 관리(사용)

    - 위에서 설정한 대로 Java(jdk) 버전 관리를 좀 더 편하게 할 수 있게 됐습니다. alternatives --config 명령어를 이용해 자바 버전을 변경해 봅시다.

    2.1. 현재 Java버전 확인

    - 현재 자바 버전을 확인해 봅니다.

    1. 자바 명령어를 이용해 확인해 본 결과 현재 14.0.2 버전으로 세팅되어 있습니다.
    # java -version
    openjdk version "14.0.2" 2020-07-14
    OpenJDK Runtime Environment (build 14.0.2+12-46)
    OpenJDK 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)
    
    # javac -version
    javac 14.0.2
    
    2. 환경변수 확인(해당 디렉터리로 접근해 버전을 확인한다.)
    # cd $JAVA_HOME
    # ls
    bin  conf  include  jmods  legal  lib  release
    
    # cat release
    IMPLEMENTOR="Oracle Corporation"
    JAVA_VERSION="14.0.2"
    JAVA_VERSION_DATE="2020-07-14"
    MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.vm.ci jdk.management jdk.unsupported jdk.internal.vm.compiler jdk.aot jdk.internal.jvmstat jdk.attach jdk.charsets jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.incubator.foreign jdk.internal.opt jdk.jdeps jdk.jlink jdk.incubator.jpackage jdk.internal.le jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management.agent jdk.jconsole jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.rmic jdk.scripting.nashorn jdk.scripting.nashorn.shell jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported.desktop jdk.xml.dom jdk.zipfs"
    OS_ARCH="x86_64"
    OS_NAME="Linux"
    SOURCE=".:hg:55692db5e928"

    2.2. Java버전 변경

    - alternatives --config 명령어를 이용해 자바 버전을 변경 후 확인해봅니다. (14.0.2 → 15.0.2)

    1. 심볼릭 링크 그룹 마스터 변경 alternatives --config name
    # alternatives --config java_home
    
    2 개의 프로그램이 'java_home'를 제공합니다.
    
      선택    명령
    -----------------------------------------------
    *+ 1           /usr/local/lib/jdk-14.0.2
       2           /usr/local/lib/jdk-15.0.2
    
    현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오:2
    
    2. 자바버전 확인
    # java -version
    openjdk version "15.0.2" 2021-01-19
    OpenJDK Runtime Environment (build 15.0.2+7-27)
    OpenJDK 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
    # javac -version
    javac 15.0.2
    
    3. 환경변수 확인(해당 디렉터리로 접근해 버전을 확인한다.)
    # cd $JAVA_HOME
    # ls
    bin  conf  include  jmods  legal  lib  release
    
    # cat release
    IMPLEMENTOR="Oracle Corporation"
    JAVA_VERSION="15.0.2"
    JAVA_VERSION_DATE="2021-01-19"
    MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.vm.ci jdk.management jdk.unsupported jdk.internal.vm.compiler jdk.aot jdk.internal.jvmstat jdk.attach jdk.charsets jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.incubator.foreign jdk.internal.opt jdk.jdeps jdk.jlink jdk.incubator.jpackage jdk.internal.le jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management.agent jdk.jconsole jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported.desktop jdk.xml.dom jdk.zipfs"
    OS_ARCH="x86_64"
    OS_NAME="Linux"
    SOURCE=".:hg:38912b2a5bcb"