패키지 저장소가 없는 폐쇄망이거나, 배포판이 제공하지 않는 벤더·버전의 JDK 가 필요할 때 쓴다. 저장소를 쓸 수 있으면 dnf install java-21-openjdk-devel 쪽이 갱신까지 관리돼 편하다.
배포본은 용도에 맞게 고른다. Eclipse Temurin · Amazon Corretto · Azul Zulu · Red Hat build of OpenJDK 는 모두 OpenJDK 기반이고 무상으로 쓸 수 있다. Oracle JDK 는 라이선스 조건을 먼저 확인한다.
/opt 아래에 푸는 것을 기준으로 한다. /usr/local 도 흔히 쓰인다.
sudo mkdir -p /opt/java
sudo tar -xzf jdk-21_linux-x64_bin.tar.gz -C /opt/java
ls /opt/java
# jdk-21.0.5+11
버전을 여러 개 두고 바꿔 쓸 수 있게 심볼릭 링크를 하나 둔다. 교체할 때 링크만 옮기면 되므로 환경 변수를 다시 손대지 않아도 된다.
sudo ln -sfn /opt/java/jdk-21.0.5+11 /opt/java/current
소유자는 root 로 두고 일반 사용자는 읽기·실행만 갖게 한다.
sudo chown -R root:root /opt/java
모든 사용자에게 적용하려면 /etc/profile.d 에 스크립트를 둔다. 이 디렉터리의 .sh 파일은 로그인 셸이 자동으로 읽는다.
sudo tee /etc/profile.d/java.sh >/dev/null <<'PROFILE'
export JAVA_HOME=/opt/java/current
export PATH=$JAVA_HOME/bin:$PATH
PROFILE
sudo chmod 644 /etc/profile.d/java.sh
현재 셸에 즉시 반영하려면 직접 읽는다. 새로 로그인하면 자동으로 걸린다.
. /etc/profile.d/java.sh
systemd 서비스는 로그인 셸을 거치지 않으므로 이 값을 보지 못한다. 유닛 파일에 따로 적어 준다.
[Service]
Environment=JAVA_HOME=/opt/java/current
시스템 패키지 JDK 와 함께 두고 전환하려면 alternatives 에 넣는다. 우선순위 숫자가 큰 쪽이 자동 선택된다.
sudo alternatives --install /usr/bin/java java /opt/java/current/bin/java 20000
sudo alternatives --install /usr/bin/javac javac /opt/java/current/bin/javac 20000
sudo alternatives --config java
데비안 계열은 명령 이름이 update-alternatives 다.
java -version
javac -version
echo "$JAVA_HOME"
readlink -f "$(which java)"
java -version 은 출력을 표준 오류로 낸다. 스크립트에서 잡을 때는 2>&1 을 붙인다.
java -version 2>&1 | head -1
버전은 맞는데 애플리케이션이 다른 JDK 를 쓴다면 그 프로세스가 보는 JAVA_HOME 을 확인한다.
tr '\0' '\n' < /proc/<PID>/environ | grep -i java