0%

Ubuntu/centOS 에서 Java(JDK) 버전을 빠르게 바꾸는 방법 (update-alternatives)

다수의 JDK를 사용하게 되었습니다.

Oracle에서 Java SE 유료화 정책을 본격 시행됨에 따라, OpenJDK를 사용하게 되었습니다.
그 중에 Java 1.8 버전을 사용하고 있는데, 업무상 1.7 버전도 필요하게 되었습니다.

그런데 일일히 쓸 때마다 환경변수를 바꾸니 보통 번거로운 일이 아닐 수 없었습니다.

따라서 이번 글에서는 Ubuntu나 centOS에서 update-alternatives 명령어를 활용하여,
JDK 버전을 적재적시(!) 바꾸는 팁을 소개하고자 합니다.


현재 상황

우선 Java가 설치되어있는, 또는 지정되어 있는 위치와 현재 시스템에서 사용되는 JDK 버전을 확인해봅시다.

Java 설치 경로

1
2
3
$ which java

/usr/bin/java

특별하게 경로를 지정하면서 설치하지 않는 이상 위와 같은 경로 또는 /usr/lib/jvm 디렉토리에 설치가 되는 것을 확인할 수가 있습니다.

실제 Java 버전은…

1
2
$ java -version
$ javac -version

위와 같은 명령어를 입력해보면 OpenJDK 1.7 또는 1.8 환경을 확인할 수 있습니다.

어… 문제는 이제 발생됩니다.

1
2
3
4
5
sudo apt-get install openjdk-7-jdk

# 또는

sudo apt-get install openjdk-8-jdk

기존 설치된 JDK에서 새로운 JDK를 설치하고 나서 버전과 경로를 확인하면
새로운 버전과 그에 대한 경로로로 바뀌거나, 바뀌지 않는 문제가 발생됩니다.

따라서

필요 JDK 버전을 바꿔 작업하는 상황이 오면 일일히 removeautoremove 또는 purge를 해야할 수도 있을 것입니다.


update-alternatives

일단 이 명령어를 간략하게 소개하자면 이름에서 보시다시피 alternative 를 update 한다는 것입니다.

뭔 설명이 그래….

그러니까 ‘대안이 될 만한’, 또는 ‘선택이 가능한 요소’로 사용이 가능토록 교체해준다는 것입니다.

현재 겪고 있는 상황에 빗대자면

여기서, 선택이 가능한 요소란 OpenJDK 1.7과 1.8 입니다.
위 두 버전 중에 한 버전을 작업이 가능토록 설정해야하는 것입니다.

저를 포함하여 Java 로 무언가를 작업하시는 분들이라면 여기서 바꿔줘야할 부분은
$JAVA_HOME, java, javac, javadoc, jar … 아무튼 Java와 관련된 것은 틀림 없을겁니다.

일단 적용해보자

java, javac, javadoc, jar … 일일히 바꿔보죠..

아, 근데 이건 좀 많은데.. 뭐 일단 해봅시다.

1
2
3
4
5
alternatives --install <link> <name> <path> <priority>
alternatives --remove <name>
alternatives --config <name>
alternatives --display <name>
alternatives --set <name> <path>

변수 없이 단순히 update-alternatives 명령어를 입력하면 위와 같은 도움말이 등장합니다.

도움말 내용을 보니, 입력이 가능한 변수값에는 <link>, <name>, <path> 가 있습니다.

“아! symbolic link를 활용하는 것이군요!”

네, 그렇습니다.

보통 update-alternatives 에서는 –config 옵션과 name 변수값을 주로 사용합니다.
–config 옵션을 통해 관리되는 name 값에 대한 위치 지정할 수 있습니다.

1
$ update-alternatives java

라는 명령어를 입력하면,

1
2
3
4
*+  1   /usr/lib/jvm/java-7-openjdk-amd64/bin/java
2 /usr/lib/jvm/java-8-openjdk-amd64/bin/java

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

라는 화면을 확인할 수 있습니다. 이는, 1번 옵션이 곧 java라는 것을 가리키는 것을 확인할 수 있고,
새로운 환경으로 지정할 지 고를 수 있다는 것이죠.

그러면 우리는 여기서, java를 OpenJDK 1.8로 바꾸려면 2번을 누르면 되는 것이죠! 이렇게 javac, jar, javadoc 등을 위와 같은 명령어를 통해 변경하면 됩니다.

그리고 .bashrc 나 .bash_profile (또는 사용하시는 shell 환경에 따라선 .zshrc 등) 파일에서 $JAVA_HOME을 새로 설정해줘야합니다.

1
2
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$PATH:$JAVA_HOME/bin

그런데..

잘 생각해보면, 일일히 이런 방법을 쓰는건 정말 불편하지 않을까요?

java, jar, javadoc, $JAVA_HOME …

우리가 바꿔야할 항목만 해도 최소한 4건입니다.
우리는 개발자이기에 일일히 명령어를 입력하는것은 굉장히 비효율적이라는 것을 알 수 있죠

이렇게 입력하는 동안에, 우리의 소중한 시간 1초는 더 빨리 더 멀리 더 힘차게 가게되고,
내 일은 점점 더 못 하고 미루고… 그렇게 야근을 하고…


더 효율적으로 바꾸기

따라서 제가 일을 쉽게하는 방법을 제안하고자합니다.

오래 걸렸죠? 지금부터 방법을 소개하자면…

1. OpenJDK 1.7, 1.8를 전부 설치합니다.
2. JDK 설치 위치를 전부 파악합니다. (보통 JDK는 /usr/lib/jvm에 설치)
3. 별도의 심볼릭 링크를 생성합니다.
4. update-alternatives를 통하여 별도의 심볼릭 링크 디렉토리의 java, javac 등을 등록합니다
5. 심볼릭 링크를 JDK1.7, JDK1.8 를 자동으로 변경할 수 있도록 쉘 스크립트나 alias로 자동화합니다.

입니다.


OpenJDK 1.7, 1.8를 전부 설치

이미 설치하는 방법은 검색하시면 너무나 잘 나와있습니다.
그러나 (2019.07.14 기준) 현재 OpenJDK 1.7을 단순히 명령어로 설치하기 어렵습니다.
따라서 launchpad.net 또는 별도의 repository 를 등록하고, 설치하면 됩니다.

자세한 설명은 ‘이 포스트’에서 확인하세요!


JDK 설치 위치를 전부 파악합니다.

sudo apt-get install 명령어를 통해 설치하면,
보통은 /usr/lib/jvm 디렉토리에 설치됩니다.
이 디렉토리에 접근하면

1
2
3
4
5
6
7
8
9
10
$ ls -al

drwxr-xr-x 4 root root 4096 7월 15 09:43 .
drwxr-xr-x 136 root root 4096 7월 12 17:20 ..
-rw-r--r-- 1 root root 2439 3월 28 2016 .java-1.7.0-openjdk-amd64.jinfo
-rw-r--r-- 1 root root 2714 4월 26 12:20 .java-1.8.0-openjdk-amd64.jinfo
lrwxrwxrwx 1 root root 20 3월 28 2016 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64
lrwxrwxrwx 1 root root 20 4월 26 12:20 java-1.8.0-openjdk-amd64 -> java-8-openjdk-amd64
drwxr-xr-x 7 root root 4096 7월 12 17:20 java-7-openjdk-amd64
drwxr-xr-x 7 root root 4096 7월 15 09:43 java-8-openjdk-amd64

식으로 나타나게 되는데, 심볼릭 링크는 이름대로 각 버전을 가리키는 것을 알 수 있습니다.


별도의 심볼릭 링크를 생성합니다

1
2
$ mkdir -R /opt/jdk
$ ln -s /usr/lib/jvm/java-7-openjdk /opt/jdk/current

sudo와 chown 옵션을 활용하여 개발에 지장없게끔 설정하실 필요가 있습니다.


update-alternatives로 등록합니다

우리는 install 옵션을 통해 별도로 생성한 심볼릭 링크 디렉토리 내 파일을 등록시킵니다.

update-alternatives install 옵션 사용 방식
alternatives --install <link> <name> <path> <priority>

1
2
$ sudo update-alternatives --install /usr/bin/java java /opt/jdk/current/bin/java 1
$ sudo update-alternatives --config java

명령어 설명

  1. sudo : 반드시 시스템 root 권한이 필요하기에 입력해야합니다.
  2. update-alternatives : 앞서 언급했습니다~
  3. --install : update-alternatives로, 새로운 심볼릭 링크를 등록할 것임을 알리는 옵션입니다.
  4. /usr/bin/java : 최종적으로 /usr/bin/java 로 심볼릭 링크가 저장될 것입니다. (which java 입력시 나타나는 심볼릭 링크 위치입니다.)
  5. java : java 라는 명령어를 쳐서 java 기능을 활용할 것이기에 입력해야합니다
  6. /opt/jdk/current/bin/java : 별도의 심볼릭 링크를 만들었습니다. 버전을 자유롭게 활용하기 위해 새로 만든 심볼릭 링크입니다.
  7. 1 : 숫자가 낮을수록 우선순위는 높습니다.
1
2
3
4
5
6
7
8
9
10
대체 항목 java에 대해 (/usr/bin/java 제공) 3개 선택이 있습니다.

선택 경로 우선순� 상태
------------------------------------------------------------
0 /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1081 자동 모드
* 1 /opt/jdk/current/bin/java 1 수동 모드
2 /usr/lib/jvm/java-7-openjdk-amd64/bin/java 1071 수동 모드
3 /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1081 수동 모드

Press <enter> to keep the current choice[*], or type selection number: 1

위와 같은 방법으로 javac, jar, javadoc 등을 등록합니다.

그리고 update-alternatives –display 옵션을 사용하여 정상적으로 등록되어 있는지 확인합니다.


쉘 스크립트나 alias로 자동화합니다

저는 개인적으로 alias 설정이 가장 무난하고 쉽다고 생각합니다.

1
2
3
4
5
export JAVA_HOME="/opt/jdk/current"
export PATH="$PATH:$JAVA_HOME/bin"

alias chjdk7="rm /opt/jdk/current && ln -s /usr/lib/jvm/java-1.7.0-openjdk-amd64"
alias chjdk8="rm /opt/jdk/current && ln -s /usr/lib/jvm/java-1.8.0-openjdk-amd64"

그리고 source 명령어를 입력하여 쉘 환경변수를 등록하면 됩니다.
저는 chjdk7 과 chjdk8 명령어를 alias로 등록하여 사용합니다!

chjdk7 명령어 입력시
1
2
3
4
5
6
7
8
$ java -version

java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

$ javac -version
javac 1.7.0_95
chjdk8 명령어 입력시
1
2
3
4
5
6
7
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.16.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)

$ javac -version
javac 1.8.0_212

2019년 9월 30일 월요일 오후 11시 35분

  • 오타 수정