java -version
readlink -f "$(command -v java)"
rpm -qa | grep -i jdk
readlink -f 가 실제 바이너리 경로를 보여 준다. RHEL 계열에서 패키지로 설치한 JDK 는 /usr/lib/jvm/ 아래에 버전별 디렉터리로 들어간다.
ls -l /usr/lib/jvm/
rpm -ql java-11-openjdk-devel | grep 'bin/java$'
Debian 계열은 /usr/lib/jvm/ 구조가 같고 dpkg -L openjdk-11-jdk 로 확인한다.
RHEL 계열은 /usr/bin/java 가 alternatives 심볼릭 링크다. 링크를 직접 만들지 말고 alternatives 로 바꾼다.
alternatives --display java
alternatives --config java
javac · jar · keytool 은 각각 별도 링크 그룹이다. java 만 바꾸면 컴파일은 여전히 옛 버전으로 된다.
alternatives --config javac
java-11-openjdk-devel 처럼 devel 패키지를 설치하면 javac 그룹도 등록된다. JRE 만 설치하면 javac 는 없다.
Debian 계열은 update-alternatives --config java 를 쓴다.
alternatives 는 JAVA_HOME 을 바꿔 주지 않는다. 이것을 따로 맞추지 않아 "버전을 바꿨는데 애플리케이션은 옛 것으로 뜬다"는 상황이 생긴다.
cat > /etc/profile.d/java.sh <<'EOS'
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
EOS
/usr/lib/jvm/java-11-openjdk 는 마이너 버전 디렉터리를 가리키는 링크라 패치 업데이트에도 경로가 유지된다. 마이너 버전이 박힌 경로(java-11-openjdk-11.0.21.0.9-1.el7_9.x86_64)를 직접 쓰면 업데이트 후 깨진다.
systemd 서비스는 /etc/profile.d 를 읽지 않는다. 유닛 파일이나 드롭인에 명시한다.
[Service]
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk
RHEL 7.9 · CentOS 7.9 는 기본 저장소에 java-11-openjdk 가 있다. 별도 URL 을 찾을 필요가 없다.
yum install -y java-11-openjdk java-11-openjdk-devel
alternatives --config java
alternatives --config javac
CentOS 7 은 지원이 끝나 미러가 내려갔으므로 vault 저장소나 사내 미러를 써야 한다.
저장소를 쓸 수 없으면 Adoptium(Temurin) 같은 배포판의 tar.gz 를 받아 원하는 경로에 풀고 JAVA_HOME 으로 가리키는 방법이 있다. 이 경우 alternatives 등록은 직접 한다.
alternatives --install /usr/bin/java java /opt/jdk-11/bin/java 2000
Oracle JDK 는 배포 조건이 버전마다 다르므로 상용 환경에서는 라이선스를 반드시 확인한다. OpenJDK 계열(Temurin · Corretto · Zulu · Red Hat build of OpenJDK)이 무난하다.
버전 전환보다 애플리케이션 쪽이 문제다. 전환 전에 다음을 확인한다.
Java 11 에서 제거된 모듈이 있다. javax.xml.bind(JAXB) · javax.activation · java.xml.ws 는 JDK 에 없으므로 라이브러리로 추가해야 한다. NoClassDefFoundError: javax/xml/bind/JAXBException 이 대표적인 증상이다.
-XX:+UseConcMarkSweepGC 는 사용 중단 경고가 나고 14 에서 제거됐다. 11 에서는 동작하지만 G1 로 옮기는 것이 맞다. -XX:MaxPermSize 는 8 부터 이미 사라졌다.
sun.misc.Unsafe 등 내부 API 를 쓰는 라이브러리는 경고가 나거나 막힌다.
인증서 저장소 위치가 $JAVA_HOME/lib/security/cacerts 로 바뀌었다. 8 의 jre/lib/security/cacerts 에 넣어 둔 인증서는 옮겨야 한다.
바꾼 뒤 확인은 다음으로 한다.
java -version
javac -version
echo "$JAVA_HOME"
java -XshowSettings:properties -version 2>&1 | grep -i 'java.home\|java.version'