데비안에 AdoptOpenJDK 설치하기

In 네트워크와 시스템 관리, Java 프로그래밍 by Choi Kyung-sik

데비안의 Java 패키지

Java를 개발한 썬 마이크로시스템즈는 2010년에 오라클에 인수합병되었다. 썬은 오픈소스에 친화적이었지만 오라클은 그렇지 않았다. 재배포를 허용하지 않는 라이센스 때문에 데비안에서 오라클의 Java 패키지는 빠졌다. 대신에 OpenJDK가 들어왔다. OpenJDK는 썬이 GPL로 공개한 Java 소스코드를 기반으로 하는 프로젝트이다. 오라클도 이 프로젝트에 주요 구성원으로 참여하고 있다. OpenJDK는 오라클 Java와 거의 동일하며 몇몇 상업적인 소스코드만이 빠져있다. 가장 큰 차이점이라면 소스코드의 빌드 주체와 어떤 라이센스로 배포하는가일 것이다.

데비안에서 개발을 위한 JDK(Java Development Kit)의 설치는 다음과 같이 한다.

# apt-get install default-jdk

개발이 목적이 아니라면 default-jre 패키지만을 설치할 수 있다. default JRE/JDK의 버전은 데비안 버전에 따라 달라진다. 데비안 9(stretch)는 OpenJDK v8, 데비안 10(buster)은 OpenJDK v11이다.

AdoptOpenJDK 설치

내가 사용하고 있는 Confluence, Jira, Butbucket은 AdoptOpenJDK를 권장한다. 현재 데비안은 AdoptOpenJDK를 포함하고 있지 않다. 따라서 AdoptOpenJDK 저장소에서 패키지를 설치해야 한다. root 계정으로 다음과 같이 작업한다.

  1. 패키지의 무결성 검사에 사용하는 AdoptOpenJDK GPG 키를 설치하기 위해 다음과 같이 한다.
    # wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
    
  2. AdoptOpenJDK DEB 저장소 설정을 추가하기 위해 다음의 명령어를 실행한다.
    # add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
    
  3. 다음의 명령어로 adoptopenjdk-8-hotspot 패키지를 설치한다.
    # apt-get update
    # apt-get install adoptopenjdk-8-hotspot
    

apt에 대한 GPG 키는 /etc/apt/trusted.gpg 파일이나 /etc/apt/trusted.gpg.d 디렉토리에 저장된다. 다음의 명령어로 키 리스트를 확인할 수 있다.

# apt-key list
...
        [ unknown] AdoptOpenJDK (used for publishing RPM and DEB files) <adoptopenjdk@gmail.com>
...

add-apt-repository 명령어가 없다면 먼저 software-properties-common 패키지를 설치한다. which 명령어는 add-apt-repository 명령어가 있는지 확인하는 데 유용하다.

# which add-apt-repository
# apt-get install software-properties-common
...
# which add-apt-repository
/usr/bin/add-apt-repository

위 2.의 add-apt-repository 명령은 /etc/apt/sources.list 파일 끝에 AdoptOpenJDK DEB 저장소 설정을 추가한다. 나는 깔끔함을 위해 /etc/apt/sources.list.d 디렉토리 안에 adoptopenjdk.list 파일을 만들어 설정을 옮겨 주었다. /etc/apt/sources.list.d/adoptopenjdk.list의 내용은 다음과 같다.

deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ stretch main
# deb-src https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ stretch main

데비안에 없는 패키지를 제공하는 비공식 APT 저장소를 서드파티 저장소(third-party repository)라고 부른다. /etc/apt/sources.list.d가 서드파티 저장소를 위한 것이고 파일 이름은 .list로 끝난다. 설정을 반영하기 위해서는 ‘apt-get update’ 명령어를 실행해야 한다. AdoptOpenJDK는 오픈 소스 프로젝트답게 소스코드를 제공한다. 소스코드를 받아서 설치하고자 한다면 deb-src 앞의 주석을 위한 샵(#)을 제거한다.

데비안의 Java 설정

여러 개의 Java 버전을 설치하였다면 디폴트로 사용할 Java를 선택하기 위해 다음의 명령어를 실행한다.

# update-alternatives --config java
대체 항목 java에 대해 (/usr/bin/java 제공) 5개 선택이 있습니다.

  선택       경로                                              우선순 상태
------------------------------------------------------------
  0            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java   1081      자동 모드
  1            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java   1081      수동 모드
  2            /usr/lib/jvm/j2sdk1.7-oracle/jre/bin/java            317       수동 모드
  3            /usr/lib/jvm/java-6-sun/jre/bin/java                 63        수동 모드
  4            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java       1081      수동 모드
* 5            /usr/lib/jvm/jdk-8-oracle-x64/jre/bin/java           318       수동 모드

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

원하는 Java 버전 앞에 있는 숫자를 입력하고 <Enter> 키를 누른다. 현재의 Java 버전을 확인하기 위해 다음의 명령어를 실행해 본다.

# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.252-b09, mixed mode)

디폴트로 사용할 Java 컴파일러를 선택하기 위해 위와 마찬가지로 ‘update-alternatives’ 명령어를 사용할 수 있다.

# update-alternatives --config javac
대체 항목 javac에 대해 (/usr/bin/javac 제공) 3개 선택이 있습니다.

  선택       경로                                               우선순 상태
------------------------------------------------------------
  0            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/javac   1081      자동 모드
  1            /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/javac   1081      수동 모드
  2            /usr/lib/jvm/j2sdk1.7-oracle/bin/javac                317       수동 모드
* 3            /usr/lib/jvm/jdk-8-oracle-x64/bin/javac               318       수동 모드

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

그러나 위와 같이 일일이 설정하기보다는 $JAVA_HOME/bin 디렉토리 안에 있는 실행 파일들에 대해 한꺼번에 설정할 필요가 있다. 이를 위해 java-common 패키지의 update-java-alternatives 명령어를 사용할 수 있다.

# readlink -f /usr/bin/javac
/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/javac
# readlink -f /usr/bin/keytool 
/usr/lib/jvm/jdk-8-oracle-x64/jre/bin/keytool
# update-java-alternatives -l
adoptopenjdk-8-hotspot-amd64   1081       /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64
j2sdk1.7-oracle                317        /usr/lib/jvm/j2sdk1.7-oracle
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64
java-6-sun                     63         /usr/lib/jvm/java-6-sun
jdk-8-oracle-x64               318        /usr/lib/jvm/jdk-8-oracle-x64
# update-java-alternatives -s adoptopenjdk-8-hotspot-amd64
update-alternatives: 오류: no alternatives for HtmlConverter
...
# readlink -f /usr/bin/keytool 
/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/keytool

readlink 명령어로 Java 관련 실행 파일의 경로를 확인할 수 있다. ‘update-java-alternatives -s’를 실행할 때 나오는 오류 메시지는 무시해도 괜찮다.

몇몇 응용프로그램은 Java의 설치 위치를 결정하기 위해 JAVA_HOME 환경 변수를 사용한다. JAVA_HOME의 시스템 전역 설정을 위해 /etc/environment에 다음의 내용을 추가한다.

JAVA_HOME="/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64"

JAVA_HOME의 값은 위의 ‘update-alternatives –config java’ 명령어를 실행하여 참고할 수 있다. 선호하는 Java 버전의 실행 경로에서 맨 뒤의 /bin/java를 빼고 JAVA_HOME에 할당한다. 설정한 환경 변수를 반영하기 위해 다시 로그인하거나 다음의 명령어를 실행한다.

# source /etc/environment
# echo $JAVA_HOME
/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64

/etc/environment에 설정하는 환경 변수는 로그인하는 모든 사용자에게 영향을 미친다. 다른 값을 원하는 사용자는 홈 디렉토리의 .bashrc 파일에 JAVA_HOME을 설정하여 오버라이딩할 수 있다.

참고 자료