Chapter 4. JVM 운영

1. 개요

!! 경고

2016년 2월 26일 새벽 2:38 이전에 JVM 환경을 구성하신 분들은 "<6.2 2016년 2월 26일 이전 환경 migration>"를 꼭 확인 하십시오.

이 문서는 안녕 리눅스의 JVM 환경에 대해서 기술을 합니다.

안녕 리눅스는 기본으로 openJDK 8tomcat 8을 지원합니다. 또한, Oracle JRE/JDK 8 사용을 원하시는 분들을 위하여 Oracle JRE/JDK 8환경 구축에 대한 지원을 합니다. Oracle JDK/JRE에 대해서는 <5. Oracle JDK> 항목을 참고 하십시오.

JDK 6 사용시, CentOS에서 java-1.6.0-openjdk package를 지원합니다만, 권장 하지 않습니다. openjdk는 1.7.0 부터 Oracle JDK와 대등한 수준의 API를 지원합니다. (대등한 성능을 의미하는 것이 아니라 API 대응을 의미이며, 안녕 3에서 oracle JDK가 기본이 아니라 openJDK를 기본으로 한 이유 입니다.) 그러므로 JDK 6 환경은 Oracle JDK를 받아서 직접 구성하십시오.

Oracle JDK/JRE 의 경우 6/7 버전은 lifetime이 종료 되었으므로, JDK 8로의 이전을 고려하시는 것을 권장 합니다.

2. 변경 사항

현재 안녕 리눅스에서 제공하는 JVM 관련 패키지는 다음과 같으며, 이 외의 패키지들은 CentOS의 package를 그대로 사용합니다.

안녕 JVM 환경과 CentOS 환경의 차이는 다음과 같습니다.

  1. X dependency가 분리 되었습니다.

    1. java-1.8.0-openjdk-headless package가 기본 java package 입니다.

      • "yum install java" 설치시에 기존 java-1.8.0-openjdk 가 설치되지 않고 java-1.8.0-openjdk-headless package가 설치 된다는 의미입니다.

    2. java-1.8.0-devel-gui package가 새로 추가 되었습니다.

  2. SDK 환경이 기본 1.7.0에서 1.8.0으로 업데이트 되었습니다.

    • CentOS에서 "yum install java-devel" 설치 시에, java-1.7.0-openjdk package가 설치 되던 것이 안녕 리눅스에서는 java-1.8.0-openjdk package들이 설치 됩니다.

  3. 안녕 리눅스의 openjdk-1.8.0 package들은 CentOS에서 제공하는 openjdk-1.8.0 rpm package를 풀어서 X dependency 의존성을 분리하고, 기본 패키지(java)를 headless package로 변경한 것입니다. 즉, binary와 jar 파일은 CentOS의 package와 동일 합니다.

  4. tomcat version이 8로 업그레이드 되었습니다.

  5. 안녕 리눅스에서 지원하는 Oracle JRE/JDK rpm package에 대한 사항이 javapackages-tools package에 반영이 되었습니다.

  6. java-1.7.0 package와 javav-1.6.0 package는 변경 사항이 없습니다. (X 의존성이 그대로 있습니다.)

안녕 리눅스의 java-1.8.0-openjdk을 사용을 원하지 않는다면 /etc/yum.repos.d/AnNyung.repoAN:base repository에서 java-1.8.0-openjdk를 exclude 시키십시오.

[root@an3 ~]$ cat /etc/yum.repos.d/AnNyung.repo
  .. 상략 ..
[AN:base]
name=AnNyung $annyungver Base Repository
mirrorlist=http://annyung.oops.org/mirror.php?release=$annyungver&arch=$basearch&repo=base
#baseurl=http://mirror.oops.org/pub/AnNyung/$annyungver/base/$basearch
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AnNyung-$annyungver
exclude=java-1.8.0-openjdk*
  .. 하략 ..
[root@an3 ~]

현재 http://css-validator.kldp.org/http://validator.kldp.org 의 HTML5 checker(NU)가 Oracle JDK 8 / tomcat 8 환경에서 안녕 리눅스 JVM 환경 (java-1.8.0-openjdk / tomcat 8) 으로 변경되어 운영 중입니다.

3. JVM 설치

  1. JRE 설치

    [root@an3 ~]$ yum install java               // X dependency가 필요 없을 경우
    [root@an3 ~]$ yum install java-1.8.0-openjdk // X dependency가 필요 할 경우
    [root@an3 ~]$ yum install java-1.7.0-openjdk-headless // No X dependency
    [root@an3 ~]$ yum install java-1.7.0-openjdk          // X dependency
  2. JDK 설치

    [root@an3 ~]$ yum install java-devel                   // X dependency가 필요 없을 경우
    [root@an3 ~]$ yum install java-1.8.0-openjdk-devel-gui // X dependency가 필요 할 경우
    [root@an3 ~]$ yum install java-1.7.0-openjdk-devel     // 무조건 X dependency가 있음
  3. 설치 후 JAVA 환경 변수

    [root@an3 ~]$ cat test.sh
    #!/bin/bash
    
    . /usr/share/java-utils/java-functions
    
    set_jvm
    set_javacmd
    set_jvm_dirs
    
    echo "JAVACMD     : $JAVACMD"
    echo
    echo "JAVA_HOME   : $JAVA_HOME"
    echo "JAVA_BASE   : $JAVA_BASE"
    echo
    echo "JAVA_LIBDIR : $JAVA_LIBDIR"
    echo "JAVA_LIB    : $JAVA_LIB"
    echo
    echo "JNI_LIBDIR  : $JNI_LIBDIR"
    echo "JNI_LIB     : $JNI_LIB"
    echo
    echo "JVM_ROOT    : $JVM_ROOT"
    echo "JVM_LIBDIR  : $JVM_LIBDIR"
    echo
    echo "CLASSPATH   : $CLASSPATH"
    echo
    
    // for tools.jar. find_jar searches JVM_LIBDIR values.
    JVM_LIBDIR+=":${JAVA_HOME}/lib"
    #CLASSPATH=$(find_jar commons-logging.jar commons-collections.jar servlet-api.jar tools.jar)
    CLASSPATH+=":$(find_jar servlet-api.jar)"
    if [ $? -ne 0 ]; then
       echo "Can't find some jar files"
       exit 1
    fi
    
    echo "CLASSPATH   : $CLASSPATH"
    echo
    
    exit 0
    [root@an3 ~]$ bash test.sh
    JAVACMD     : /usr/lib/jvm/jre/bin/java
    
    JAVA_HOME   : /usr/lib/jvm/jre
    JAVA_BASE   : /usr/lib/jvm
    
    JAVA_LIBDIR : /usr/share/java
    JAVA_LIB    : /usr/share/java
    
    JNI_LIBDIR  : /usr/lib/java
    JNI_LIB     : /usr/lib/java
    
    JVM_ROOT    : /usr/lib/jvm
    JVM_LIBDIR  : /usr/lib/jvm-exports/jre
    
    CLASSPATH   : /usr/share/java:/usr/lib/java
    
    CLASSPATH   : /usr/share/java:/usr/lib/java:/usr/share/java/servlet.jar
    
    [root@an3 ~]$

4. TOMCAT

안녕 리눅스의 TOMCAT은 버전만 8로 업그레이드 되었으며, 환경 구성은 CentOS와 동일 합니다.

  1. tomcat 설치

    [root@an3 ~]$ yum install tomcat
  2. 설정 파일 : /etc/tomcat

    [root@an3 ~]$ ls -l /etc/tomcat
    drwxrwxr-x 3 root   tomcat     22  2 26 05:02 Catalina/
    -rw-rw-r-- 1 tomcat tomcat  12374  2 25 17:24 catalina.policy
    -rw-rw-r-- 1 tomcat tomcat   7106  2 25 17:24 catalina.properties
    -rw-rw-r-- 1 tomcat tomcat   1577  2 25 17:24 context.xml
    -rw-rw-r-- 1 tomcat tomcat   3387  2 25 17:24 logging.properties
    -rw-rw-r-- 1 tomcat tomcat   6458  2 25 17:24 server.xml
    -rw-rw---- 1 tomcat tomcat   2212  2 25 17:24 tomcat-users.xml
    -rw-rw-r-- 1 tomcat tomcat    574  2 25 17:25 tomcat.conf
    -rw-rw-r-- 1 tomcat tomcat 168822  2 25 17:24 web.xml
    [root@an3 ~]$
  3. 로그 파일 : /var/log/tomcat

    [root@an3 ~]$ ls -l /var/log/tomcat/
    -rw-r--r-- 1 tomcat tomcat 23916  2 25 19:01 catalina.2016-02-25.log
    -rw-r--r-- 1 tomcat tomcat     0  2 25 17:56 host-manager.2016-02-25.log
    -rw-r--r-- 1 tomcat tomcat     0  2 25 17:56 localhost.2016-02-25.log
    -rw-r--r-- 1 tomcat tomcat 14181  2 25 19:00 localhost_access.2016-02-25.log
    -rw-r--r-- 1 tomcat tomcat     0  2 25 17:56 manager.2016-02-25.log
    [root@an3 ~]$
  4. CATALINA_HOME : /usr/share/tomcat

    [root@an3 ~]$ l /usr/share/tomcat/
    drwxr-xr-x 2 root root   73  2 26 05:02 bin
    lrwxrwxrwx 1 root tomcat 11  2 26 05:02 conf -> /etc/tomcat
    lrwxrwxrwx 1 root tomcat 22  2 26 05:02 lib -> /usr/share/java/tomcat
    lrwxrwxrwx 1 root tomcat 15  2 26 05:02 logs -> /var/log/tomcat
    lrwxrwxrwx 1 root tomcat 22  2 26 05:02 temp -> /var/cache/tomcat/temp
    lrwxrwxrwx 1 root tomcat 23  2 26 05:02 webapps -> /var/lib/tomcat/webapps
    lrwxrwxrwx 1 root tomcat 22  2 26 05:02 work -> /var/cache/tomcat/work
    [root@an3 ~]$
  5. 기본 DocumentRoot : /var/lib/tomcat/webapps 또는 /usr/share/tomcat/webapps

  6. tomcat 구동

    [root@an3 ~]$ service tomcat [eanble|disable]            // 부팅시 구동 여부. 또는 ntsysv-systemd 명령 이용
    [root@an3 ~]$ service tomcat [start|stop|restart|status] // tomcat 구동

Tomcat 7을 사용하기를 원한다면 /etc/yum.repos.d/AnNyung.repoAN:base repository에 tomcat을 exclude 시키십시오.

[root@an3 ~]$ cat /etc/yum.repos.d/AnNyung.repo
  .. 상략 ..
[AN:base]
name=AnNyung $annyungver Base Repository
mirrorlist=http://annyung.oops.org/mirror.php?release=$annyungver&arch=$basearch&repo=base
#baseurl=http://mirror.oops.org/pub/AnNyung/$annyungver/base/$basearch
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AnNyung-$annyungver
exclude=tomcat*
  .. 하략 ..
[root@an3 ~]

5. Oracle JDK

oracle-jreoracle-jdk가 설치된 환경은 2016년 2월 26일 이전에 제공하던 환경입니다. 안녕 리눅스 3릴리즈 직전에 안녕 리눅스의 JVM환경이 변경이 되었으니, 이전에 환경을 구성했다면 초기화 하시기 바랍니다.

[root@an3 ~]$ yum remove oracle-jre oracle-jdk tomcat

1. package 빌드

기본적으로, Oracle JDK의 경우 재배포를 허용하지 않으므로 직접 다운로드 받아서 설치를 해야 합니다.

안녕 리눅스에서는 Oracle JDK를 위하여 java-1.8.0-oracle source rpm을 제공합니다. 재배포를 허용하지 않기 때문에 source rpm으로 rebuild 시에 다운로드를 받아서 rpm을 제작 하며, 제작된 rpm들은 CentOS에서 제공하는 JVM환경과 호환이 됩니다.

또한, 제작된 RPM은 Oracle에서 제공하는 JDK 8 rpm을 받아서 file path및 Provides 정보를 CentOS JVM 환경과 동일하게 re-packaing 한 것이므로, binary 수준에서는 Oracle에서 제공하는 binary(rpm)와 동일합니다.

Warning!! 이 방법을 사용하는 것은 Oracle Binary Code License Agreement for Java SE 에 동의 한 것으로 간주 합니다. Oracle JDK를 사용함으로서 발생할 수 있는 어떠한 문제에 대해서도 안녕 리눅스에서는 책임을 지지 않으니, 문제가 될 소지를 피하기 위하여 License를 꼭 읽어 보신 후, 진행하십시오.

다음의 작업으로 oracle-jdk package를 생성할 수 있으며, build 시간은 대략 2~5분 정도 소요됩니다.

[root@an3 ~]$ yum install rpm-build rpm-devel yum-utils
[root@an3 ~]$ mkdir -p /root/rpmbuild/{BUILD,BUILDROOT,SOURCES,SPECS,SRPMS}
[root@an3 ~]$ mkdir -p /root/rpmbuild/RPMS/{noarch,x86_64}

위와 같이 rpm package를 생성할 수 있도록 준비를 합니다. 이 작업은 1회만 하면 됩니다. 패키지는 일반 유저로도 만들 수 있지만, 여기서는 일단 root 권한으로 하는 것을 가정합니다. (버전은 달라질 수 있습니다.)

[root@an3 ~]$ yumdownloader --source java-1.8.0-oracle
[root@an3 ~]$ rpmbuild --rebuild oracle-jdk-1.8.0.73-1.an3.src.rpm
[root@an3 ~]$ cd /root/rpmbuild/RPMS/x86_64
[root@an3 x86_64]$ ls -l
-rw-r--r-- 1 root root 18295560  2 25 19:51 java-1.8.0-oracle-1.8.0.73-1.an3.x86_64.rpm
-rw-r--r-- 1 root root 93091660  2 25 19:51 java-1.8.0-oracle-devel-1.8.0.73-1.an3.x86_64.rpm
-rw-r--r-- 1 root root  1231420  2 25 19:51 java-1.8.0-oracle-devel-gui-1.8.0.73-1.an3.x86_64.rpm
-rw-r--r-- 1 root root 35614032  2 25 19:51 java-1.8.0-oracle-headless-1.8.0.73-1.an3.x86_64.rpm
-rw-r--r-- 1 root root 24767532  2 25 19:51 java-1.8.0-oracle-src-1.8.0.73-1.an3.x86_64.rpm
[root@an3 x864_64]

2. Yum repository 생성하기

생성된 package를 별도의 yum repository로 만들어 관리 합니다.

[root@an3 ~] yum insatll createrepo
[root@an3 ~] mkdir -p oracle-jdk/x86_64
[root@an3 ~] mv /root/rpmbuild/RPMS/x86_64/java-1.8.0-*.rpm oracle-jdk/x86_64/
[root@an3 ~] cd oracle-jdk
[root@an3 oracle-jdk]$ createrepo --workers 5 --changelog-limit 10 ./
[root@an3 oracle-jdk]$ cat OracleJDK.repo
[Oracle JDK]
name=AnNyung $annyungver Oracle JDK Repository
baseurl=http://domain.com/oracle-jdk/$basearch
;gpgcheck=1
;gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AnNyung-$annyungver
[root@an3 oracle-jdk]$

이렇게 하면 Oracle JDK에 대한 yum repository를 생성하게 됩니다. 이 디렉토리를 Web에서 접근이 가능하돌고 설정을 한 후, OracleJDK.repo를 /etc/yum.repos.d에 복사를 합니다.

3. 설치

[root@an3 ~]$ yum install java       // install java-1.8.0-oracle-headless (JRE)
[root@an3 ~]$ yum install java-devel // install java-1.8.0-orcale-devel (JDK)

X libaray나 audio, video API를 사용하기 위해서는 다음의 명령으로 설치 하셔야 합니다.

[root@an3 ~]$ yum install java-1.8.0-oracle           // install JRE
[root@an3 ~]$ yum install java-1.8.0-oracle-devel-gui // install JDK

java-1.7.0-openjdkjava-1.8.0-openjdk package와 같이 설치 할 수있습니다.

4. Oracle JVM EOL(End Of Lifetime)

안녕 리눅스에서 제공하는 Oracle JVM(java-1.8.0-oracle)은 해당 패키지 배포처의 binary package를 사용하는 것이기 때문에, 이들 package의 life time은 Oracle JDK의 life time 까지만 제공 합니다.

  1. JAVA SE 8

5. 안녕 리눅스 oracle-jre 업데이트 주기

안녕 리눅스의 oracle-jre 업데이트는 oracle에서 제공하는 년 3회의 Critical Patch Update release에 대응 합니다.

Oracle의 2017년 Critical Patch Update 예정은 다음과 같습니다.

6. CentOS JVM 환경으로 rollback

이 섹션은 안녕 리눅스의 JVM환경을 사용하지 않는 방법을 설명합니다. 또한, 안녕 3 릴리즈 전(정확히는 2016.02.26 전)에 안녕의 JVM 환경을 설치했을 경우의 rollback에 대한 설명을 기술 합니다.

1. 안녕 리눅스 JVM 환경 사용 하지 않기

  1. 설치되어 있는 패키지를 제거 합니다. (설치 전이라면 2번으로 넘어 갑니다.)

    [root@an3 ~]$ yum remove "tomcat*" "java-1.8.0-oracle*"
  2. [AN:base] repository에서 tomcatjava-1.8.0-openjdk를 배포하지 않도록 설정 합니다.

    [root@an3 ~]$ cat /etc/yum.repos.d/AnNyung.repo
     .. 상략 ..
    [AN:base]
    name=AnNyung $annyungver Base Repository
    mirrorlist=http://annyung.oops.org/mirror.php?release=$annyungver&arch=$basearch&repo=base
    #baseurl=http://mirror.oops.org/pub/AnNyung/$annyungver/base/$basearch
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AnNyung-$annyungver
    exclude=java-1.8.0-openjdk* tomcat*
     .. 하략 ..
    [root@an3 ~]
  3. Yum cache를 reset 후 재설치를 합니다.

    [root@an3 ~]$ yum clean all
    [root@an3 ~]$ yum install java tomcat

2. 2016년 2월 26일 이전 환경 migration

이 섹션은 2016년 2월 26일 이전, oracle-jre package와 tomcat package를 제공하던 환경을 안녕 리눅스 3 공식적인 환경으로 migration 하는 방법을 기술 합니다.

  1. 기존의 package를 제거 합니다.

    [root@an3 ~]$ yum remove "tomcat*" oracle-jre oracle-jdk
  2. /etc/yum.repos.d/AnNyung.repo 파일에서 exclude= 항목에 아래와 같이 tomcat, oracle-jre, oracle-jdk, *java* 이 있으면 제거 합니다.

    [root@an3 ~]$ cat /etc/yum.repos.d/AnNyung.repo
    
    ** 상략 **
    
    [AN:base]
    name=AnNyung $annyungver Base Repository
    mirrorlist=http://annyung.oops.org/mirror.php?release=$annyungver&arch=$basearch&repo=base
    #baseurl=http://mirror.oops.org/pub/AnNyung/$annyungver/base/$basearch
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AnNyung-$annyungver
    #exclude=tomcat* oracle-jre *java*
    
     ** 중략 **
    
    [AN:addon]
    name=AnNyung $annyung-ver addon Repository
    mirrorlist=http://annyung.oops.org/mirror.php?release=$annyungver&arch=$basearch&repo=addon
    #baseurl=http://mirror.oops.org/pub/AnNyung/$annyungver/addon/$basearch
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AnNyung-$annyungver
    #exclude=tomcat* oracle-jre *java*
    
     ** 하략 **
    
    [root@an3 ~]$
  3. CentOS Yum repository 설정에서 JVM 관련 제한을 풀어줍니다. /etc/yum.repos.d/CentOS-Base.repo 에서 아래의 예와 같이 모든 exclude=XXX 라인에서 java와 tomcat을 제거 합니다. 아래의 예는 [update] repository만 예를 들었지만 파일에 있는 모든 repository에 대해서 수정해 주셔야 합니다.

    [updates]
    name=CentOS-$releasever - Updates
    mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    #exclude=php* pear* httpd* mysql* mariadb* *java* *tomcat*
    exclude=php* pear* httpd* mysql* mariadb*

Last updated