Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell로 Windows에서 Java 버전 확인 및 업데이트하는 완벽 가이드

JRE(Java Runtime Environment)는 기업용 Java 애플리케이션을 실행하기 위해 사용자 PC에 널리 설치되어 있습니다. 하지만 일부 애플리케이션은 특정 Java 버전에서만 정상적으로 동작하며, 다른 버전에서는 오류가 발생할 수 있습니다. 이 글에서는 네트워크상의 컴퓨터에 설치된 Java 버전을 확인하는 방법과, PowerShell을 활용해 JRE를 제거하거나 최신 버전으로 업데이트하는 방법을 단계별로 살펴봅니다.

Windows에서 Java 버전 확인하는 방법

Windows 검색 상자에 java를 입력한 후 Java 애플릿을 실행하면 현재 설치된 Java 버전을 확인할 수 있습니다.

About Java(Java 정보) 창에 현재 JRE 버전이 표시됩니다. 예를 들어 Java Version 8 Update 261 (build 1.8.0_261-b12)와 같은 형식입니다. 여기서 JRE 빌드 값에 주목할 필요가 있습니다. 모든 Java 버전 번호는 맨 앞의 '1' 뒤에 주 버전 번호(위 예시에서는 8), 그리고 업데이트 번호가 붙는 구조입니다.

또한 Windows의 '프로그램 및 기능'(Win+R → appwiz.cpl)에서도 현재 설치된 Java 버전을 확인할 수 있습니다.

명령 프롬프트에서도 간단히 확인할 수 있습니다. cmd.exe를 실행한 후 아래 명령을 입력합니다.

java -version

java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) Client VM (build 25.261-b12, mixed mode, sharing)

PowerShell로 Java 버전 확인하기

PowerShell을 사용해서도 설치된 Java 버전을 확인할 수 있습니다. 가장 간단한 방법은 실행 파일 java.exe의 파일 버전을 조회하는 것입니다(JRE SE 설치 시 환경 변수에 경로가 등록됩니다).

Get-Command Java | Select-Object Version

버전, 업데이트, 릴리스 번호 등 상세 정보를 보려면 아래 명령을 사용합니다.

Get-Command java | Select-Object -ExpandProperty Version

Major Minor Build Revision
----- ----- ----- --------
8     0     2610  12

스크립트에서 활용할 수 있는 문자열 형태의 버전 값이 필요하다면 다음 명령을 사용하세요.

(Get-Command java | Select-Object -ExpandProperty Version).tostring()

WMI 클래스인 Win32_Product(Windows에 설치된 프로그램 목록 포함)를 통해서도 Java 버전을 확인할 수 있습니다.

Get-WmiObject -Class Win32_Product -Filter "Name like '%Java%'"

IdentifyingNumber : {26A24AE4-039D-4CA4-87B4-2F32180261F0}
Name              : Java 8 Update 261
Vendor            : Oracle Corporation
Version           : 8.0.2610.12
Caption           : Java 8 Update 261

IdentifyingNumber : {4A03706F-666A-4037-7777-5F2748764D10}
Name              : Java Auto Updater
Vendor            : Oracle Corporation
Version           : 2.8.261.12
Caption           : Java Auto Updater

여기서 얻은 ID(Product GUID)는 나중에 JRE를 정확하게 제거할 때 유용하게 활용됩니다.

Java Auto Updater를 제외하고 Java 버전만 표시하려면 아래 명령을 사용합니다.

Get-WmiObject -Class Win32_Product -Filter "Name like '%Java%' and not Name like '%Java Auto Updater%'" | Select -Expand Version

PowerShell – 원격 컴퓨터의 Java 버전 확인

도메인 내 모든 컴퓨터나 서버에서 사용 중인 Java 버전을 점검하려면 다음 PowerShell 스크립트를 활용할 수 있습니다. 스크립트는 직접 입력한 목록 또는 텍스트 파일의 서버 목록을 기반으로 원격으로 정보를 수집합니다. RSAT-AD-PowerShell 모듈의 Get-ADComputer cmdlet을 사용하면 Active Directory에서 서버·컴퓨터 목록을 자동으로 가져올 수도 있습니다.

# PowerShell script to check Java SE (JRE) version on remote computers
# To check Java version on the computers in the list
# $computers = @('mun-sql01,mun-fs01,mun-sql02')
# Check Java version against the list of servers in a text file
#$computers=Get-content C:\PS\ServerList.txt
# To get Java version on all Windows Servers in AD domain
$computers = ((get-adcomputer -Filter { enabled -eq "true" -and OperatingSystem -Like '*Windows Server*' }).name).tostring()
Get-WmiObject -Class Win32_Product -ComputerName $computers -Filter "Name like '%Java%' and not Name like '%Java Auto Updater%'" | Select __Server, Version

실행 결과로 컴퓨터/서버 목록과 각 시스템에 설치된 Java 버전이 담긴 표를 얻게 됩니다. 실제로 필자가 도메인 컴퓨터의 Java 버전을 점검했을 때 무려 24개의 서로 다른 JRE 버전이 발견되기도 했습니다!

모든 Java 버전을 일괄 제거하는 PowerShell 스크립트

그렇다면 Windows에서 기존 Java 버전을 제거해야 하는 이유는 무엇일까요?

  • 보안 강화: 새 Java 버전을 설치하기 전에는 기존 버전을 모두 제거하는 것이 좋습니다. 다른 소프트웨어와 마찬가지로 Java에도 새로운 기능이 추가되고 치명적인 취약점이 지속적으로 수정됩니다. 구버전이 남아 있으면 알려진 취약점이나 0-day 공격에 노출될 위험이 큽니다. Java에는 자동 업데이트 메커니즘이 내장되어 있지만, 관리자가 여러 사정으로 도메인 컴퓨터에서 이를 비활성화하는 경우가 많습니다.
  • 라이선스 문제: 유료 Java JRE 구독이 없는 경우도 있습니다. 2019년 Oracle은 Java 라이선스 정책을 변경해, 기존 Oracle JDK(Java SE) 버전을 계속 사용하려면 유료 구독이 필요하도록 바꿨습니다. 이는 2019년 4월 16일 이후 배포된 모든 Java JRE 릴리스(Java 8 SE Update 211부터)에 적용됩니다.
    상업용 Java SE 버전은 장기 지원(LTS)을 제공하며 출시 후 5년간 업데이트가 제공됩니다. 무료 대안은 GPL 라이선스로 배포되는 OpenJDK이지만 6개월마다 새 버전으로 업데이트해야 하는 단점이 있습니다. 또한 OpenJDK는 Windows용 편리한 설치 관리자가 없어 직접 다운로드·설치해야 합니다. Chocolatey 패키지 관리자를 활용하면 비교적 간편하게 설치할 수 있습니다: choco install openjdk

다음 PowerShell 스크립트를 사용하면 로컬 컴퓨터에 설치된 모든 Java 버전을 제거할 수 있습니다.

$jre_installed = Get-WmiObject -Class Win32_Product -Filter "Name like '%Java%'"
$jre_installed.Uninstall()

다만 위 명령은 WMI 기반이라 실행 속도가 느린 편입니다.

대신 레지스트리에서 설치된 Java 버전 목록을 가져온 뒤, MSI 설치 시 생성되는 제품 GUID를 이용해 전체를 제거하는 방법이 더 효율적입니다.

# PowerShell script to uninstall all Java SE (JRE) versions on a computer
$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -like "*Java*" } | select UninstallString
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -like "*Java*" } | select UninstallString
# Uninstall 64-bit Java versions
if ($uninstall64) {
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe", "" -Replace "/I", "" -Replace "/X", ""
$uninstall64 = $uninstall64.Trim()
Write "Uninstalling Java ..."
start-process "msiexec.exe" -arg "/X $uninstall64 /qb" -Wait
}
# Uninstall 32-bit Java versions
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling all Java SE versions..."
start-process "msiexec.exe" -arg "/X $uninstall32 /qb" -Wait
}

PowerShell로 Java JRE를 다운로드하고 설치하는 방법

아래 PowerShell 스크립트는 공식 웹사이트에서 최신 Java 설치 파일을 자동으로 다운로드해 컴퓨터에 설치합니다(온라인/오프라인 설치 파일 모두 선택 가능). 설치 명령은 재부팅 요청을 억제하고 Java 자동 업데이트를 비활성화합니다.

설치 파일 다운로드에는 Invoke-WebRequest cmdlet이 사용됩니다. 컴퓨터가 프록시 환경에 있다면 PowerShell이 프록시 서버를 통해 인터넷에 접속하도록 미리 설정해야 합니다.

# PowerShell script to automatically download and install the latest Java SE (JRE) version
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Download an online Java installer
$URL = (Invoke-WebRequest -UseBasicParsing https://www.java.com/en/download/manual.jsp).Content | % { [regex]::matches($_, '(?:<a title="Download Java software for Windows Online" href=")(.*)(?:">)').Groups[1].Value }
# Download an offline Java installer
#$URL = (Invoke-WebRequest -UseBasicParsing https://www.java.com/en/download/manual.jsp).Content | % { [regex]::matches($_, '(?:<a title="Download Java software for Windows Offline" href=")(.*)(?:">)').Groups[1].Value }
Invoke-WebRequest -UseBasicParsing -OutFile jre8.exe $URL
Start-Process .\jre8.exe '/s REBOOT=0 SPONSORS=0 AUTO_UPDATE=0' -wait
echo $?

스크립트 첫 줄은 TLS 1.2 프로토콜을 사용하기 위해 추가된 것입니다. 이 줄이 없으면 다음과 같은 오류가 발생합니다.

Invoke-WebRequest: The request was aborted: Could not create SSL/TLS secure channel.

정상적으로 실행되면 스크립트가 Java 설치 파일을 자동으로 다운로드해 jre8.exe로 저장한 후 설치를 진행합니다.

참고: 안타깝게도 최근 Oracle 웹사이트 구조 변경으로 인해 위 방식으로 JRE 설치 파일 링크를 가져오는 방법은 더 이상 작동하지 않습니다. 현재 해당 페이지는 JavaScript로 동적으로 생성되어 설치 파일 URL을 직접 추출할 수 없으며, Oracle의 정책 변화에 따라 향후 달라질 수 있습니다.