다수의 JDK를 사용하게 되었습니다.
Oracle에서 Java SE 유료화 정책을 본격 시행됨에 따라, OpenJDK를 사용하게 되었습니다.
그 중에 Java 1.8 버전을 사용하고 있는데, 업무상 1.7 버전도 필요하게 되었습니다.
그런데 일일히 쓸 때마다 환경변수를 바꾸니 보통 번거로운 일이 아닐 수 없었습니다.
따라서 이번 글에서는 Ubuntu나 centOS에서 update-alternatives 명령어를 활용하여,
JDK 버전을 적재적시(!) 바꾸는 팁을 소개하고자 합니다.
현재 상황
우선 Java가 설치되어있는, 또는 지정되어 있는 위치와 현재 시스템에서 사용되는 JDK 버전을 확인해봅시다.
Java 설치 경로
1 | which java |
특별하게 경로를 지정하면서 설치하지 않는 이상 위와 같은 경로 또는 /usr/lib/jvm 디렉토리에 설치가 되는 것을 확인할 수가 있습니다.
실제 Java 버전은…
1 | java -version |
위와 같은 명령어를 입력해보면 OpenJDK 1.7 또는 1.8 환경을 확인할 수 있습니다.
어… 문제는 이제 발생됩니다.
1 | sudo apt-get install openjdk-7-jdk |
기존 설치된 JDK에서 새로운 JDK를 설치하고 나서 버전과 경로를 확인하면
새로운 버전과 그에 대한 경로로로 바뀌거나, 바뀌지 않는 문제가 발생됩니다.
따라서
필요 JDK 버전을 바꿔 작업하는 상황이 오면 일일히 remove 나 autoremove 또는 purge를 해야할 수도 있을 것입니다.
update-alternatives
일단 이 명령어를 간략하게 소개하자면 이름에서 보시다시피 alternative 를 update 한다는 것입니다.
뭔 설명이 그래….
그러니까 ‘대안이 될 만한’, 또는 ‘선택이 가능한 요소’로 사용이 가능토록 교체해준다는 것입니다.
현재 겪고 있는 상황에 빗대자면
여기서, 선택이 가능한 요소란 OpenJDK 1.7과 1.8 입니다.
위 두 버전 중에 한 버전을 작업이 가능토록 설정해야하는 것입니다.
저를 포함하여 Java 로 무언가를 작업하시는 분들이라면 여기서 바꿔줘야할 부분은
$JAVA_HOME, java, javac, javadoc, jar … 아무튼 Java와 관련된 것은 틀림 없을겁니다.
일단 적용해보자
java, javac, javadoc, jar … 일일히 바꿔보죠..
아, 근데 이건 좀 많은데.. 뭐 일단 해봅시다.
1 | alternatives --install <link> <name> <path> <priority> |
변수 없이 단순히 update-alternatives 명령어를 입력하면 위와 같은 도움말이 등장합니다.
도움말 내용을 보니, 입력이 가능한 변수값에는 <link>, <name>, <path> 가 있습니다.
“아! symbolic link를 활용하는 것이군요!”
네, 그렇습니다.
보통 update-alternatives 에서는 –config 옵션과 name 변수값을 주로 사용합니다.
–config 옵션을 통해 관리되는 name 값에 대한 위치 지정할 수 있습니다.
1 | update-alternatives java |
라는 명령어를 입력하면,
1 | *+ 1 /usr/lib/jvm/java-7-openjdk-amd64/bin/java |
라는 화면을 확인할 수 있습니다. 이는, 1번 옵션이 곧 java라는 것을 가리키는 것을 확인할 수 있고,
새로운 환경으로 지정할 지 고를 수 있다는 것이죠.
그러면 우리는 여기서, java를 OpenJDK 1.8로 바꾸려면 2번을 누르면 되는 것이죠! 이렇게 javac, jar, javadoc 등을 위와 같은 명령어를 통해 변경하면 됩니다.
그리고 .bashrc 나 .bash_profile (또는 사용하시는 shell 환경에 따라선 .zshrc 등) 파일에서 $JAVA_HOME을 새로 설정해줘야합니다.
1 | export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk |
그런데..
잘 생각해보면, 일일히 이런 방법을 쓰는건 정말 불편하지 않을까요?
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 | ls -al |
식으로 나타나게 되는데, 심볼릭 링크는 이름대로 각 버전을 가리키는 것을 알 수 있습니다.
별도의 심볼릭 링크를 생성합니다
1 | mkdir -R /opt/jdk |
sudo와 chown 옵션을 활용하여 개발에 지장없게끔 설정하실 필요가 있습니다.
update-alternatives로 등록합니다
우리는 install 옵션을 통해 별도로 생성한 심볼릭 링크 디렉토리 내 파일을 등록시킵니다.
update-alternatives install 옵션 사용 방식
alternatives --install <link> <name> <path> <priority>
1 | sudo update-alternatives --install /usr/bin/java java /opt/jdk/current/bin/java 1 |
명령어 설명
- sudo : 반드시 시스템 root 권한이 필요하기에 입력해야합니다.
- update-alternatives : 앞서 언급했습니다~
- --install : update-alternatives로, 새로운 심볼릭 링크를 등록할 것임을 알리는 옵션입니다.
- /usr/bin/java : 최종적으로 /usr/bin/java 로 심볼릭 링크가 저장될 것입니다. (which java 입력시 나타나는 심볼릭 링크 위치입니다.)
- java : java 라는 명령어를 쳐서 java 기능을 활용할 것이기에 입력해야합니다
- /opt/jdk/current/bin/java : 별도의 심볼릭 링크를 만들었습니다. 버전을 자유롭게 활용하기 위해 새로 만든 심볼릭 링크입니다.
- 1 : 숫자가 낮을수록 우선순위는 높습니다.
1 | 대체 항목 java에 대해 (/usr/bin/java 제공) 3개 선택이 있습니다. |
위와 같은 방법으로 javac, jar, javadoc 등을 등록합니다.
그리고 update-alternatives –display 옵션을 사용하여 정상적으로 등록되어 있는지 확인합니다.
쉘 스크립트나 alias로 자동화합니다
저는 개인적으로 alias 설정이 가장 무난하고 쉽다고 생각합니다.
1 | export JAVA_HOME="/opt/jdk/current" |
그리고 source 명령어를 입력하여 쉘 환경변수를 등록하면 됩니다.
저는 chjdk7 과 chjdk8 명령어를 alias로 등록하여 사용합니다!
1 | java -version |
1 | java -version |
2019년 9월 30일 월요일 오후 11시 35분
- 오타 수정