
Windows에 Java JDK를 설치했는데 명령 프롬프트에서 java 또는 javac 명령어를 찾을 수 없습니다라는 오류가 나타날 때가 있습니다.
JDK가 정상적으로 설치돼 있어도 Windows가 실행 파일의 위치를 찾지 못하거나, 이전에 설치한 다른 Java 버전을 먼저 불러오면 이런 문제가 발생합니다.
이럴 때 확인해야 할 핵심 항목이 JAVA_HOME과 Path 환경변수입니다.
다만 과거 설정방법처럼 `JAVA_HOME`, `Path`, `CLASSPATH`를 무조건 모두 추가할 필요는 없습니다. 일반적인 최신 Java 개발 환경에서는 JAVA_HOME과 Path만 정확하게 설정하고, 전역 CLASSPATH는 등록하지 않는 편이 안전합니다.
자바 환경변수 설정 3줄 요약
1. `JAVA_HOME`에는 `bin`이 아닌 JDK 최상위 설치 폴더를 입력합니다.
2. Windows Path에는 %JAVA_HOME%\bin을 한 줄로 추가합니다.
3. 설정 후 새 CMD를 열어 `where java`, `java -version`, `javac -version`을 확인합니다.
환경변수를 설정하기 전에 JDK, JRE와 JVM의 역할부터 구분해야 합니다.
| 구분 | 역할 | 주요 구성요소 |
|---|---|---|
| JDK | Java 프로그램 개발과 실행 | java, javac, jar, javadoc, jshell, JVM과 런타임 |
| JRE | Java 프로그램 실행 환경을 뜻하는 개념 | JVM과 Java 표준 라이브러리 |
| JVM | 컴파일된 Java 바이트코드 실행 | 메모리 관리, 클래스 로딩과 코드 실행 |
최신 Java 개발이나 컴파일이 목적이라면 별도의 구형 JRE 설치 파일보다 JDK를 설치하는 것이 기본입니다.
JDK의 `bin` 폴더에는 다음과 같은 명령어가 포함됩니다.
| 명령어 | 기능 |
|---|---|
| java | 컴파일된 Java 클래스와 JAR 파일 실행 |
| javac | .java 소스 파일을 .class 바이트코드로 컴파일 |
| jar | Java 클래스와 리소스를 JAR 파일로 묶거나 해제 |
| javadoc | Java 소스의 API 문서 생성 |
| jshell | Java 코드를 대화형으로 테스트 |
| javap | 컴파일된 클래스 파일의 구조 확인 |
2026년 8월 기준 Java SE의 최신 기능 릴리스는 JDK 26이고, 장기지원 버전은 JDK 25 LTS입니다.
| 버전 | 성격 | 추천 환경 |
|---|---|---|
| JDK 26 | 최신 비 LTS 기능 릴리스 | 최신 기능 테스트·빠른 업데이트가 가능한 환경 |
| JDK 25 | 최신 LTS 릴리스 | 새 프로젝트·장기간 운영·기업 개발환경 |
| JDK 21 | 이전 LTS 릴리스 | 기존 프레임워크와 호환성이 필요한 환경 |
| JDK 17·11·8 | 레거시 LTS 환경 | 구형 프로그램이 정확한 버전을 요구할 때 |
프로그램이 요구하는 Java 버전을 먼저 확인하세요.
UG NX, CATIA, 서버 프로그램, 전자결재와 구형 업무 프로그램은 최신 JDK가 아닌 Java 8·11·17처럼 특정 버전을 요구할 수 있습니다.
| 환경변수 | 역할 | 권장 설정 |
|---|---|---|
| JAVA_HOME | Maven·Gradle·Tomcat·IDE 등이 사용할 JDK 최상위 폴더 지정 | 필요하면 설정 |
| Path | CMD와 PowerShell이 java·javac 실행 파일을 찾는 위치 | %JAVA_HOME%\bin 추가 |
| CLASSPATH | Java 클래스와 JAR 검색 위치 | 전역 설정하지 않음 |
일부 JDK Windows 설치 프로그램은 다음 폴더를 Path에 등록해 `java`, `javac`와 `jshell` 명령을 실행할 수 있도록 합니다.
C:\Program Files\Common Files\Oracle\Java\javapath
이 때문에 JAVA_HOME이 비어 있어도 `java -version`은 작동할 수 있습니다.
그러나 Maven이나 업무 프로그램은 Path가 아닌 JAVA_HOME 값을 직접 읽을 수 있으므로 두 설정은 역할이 다릅니다.
환경변수를 입력하기 전에 실제 JDK 설치 폴더를 확인해야 합니다.
C:\Program Files\Java\jdk-25
C:\Program Files\Java\jdk-25.0.4
C:\Program Files\Java\jdk-26
C:\Program Files\Java\jdk-26.0.2
실제 폴더 이름은 설치한 버전과 배포판에 따라 다를 수 있습니다.
C:\Program Files\Eclipse Adoptium\jdk-25...
C:\Program Files\Microsoft\jdk-21...
C:\Program Files\Amazon Corretto\jdk21...
C:\Java\jdk-25
환경변수에는 예시를 그대로 복사하지 말고 파일 탐색기에서 확인한 본인 PC의 실제 폴더를 입력합니다.
선택한 폴더 안에 다음 하위 폴더와 파일이 있는지 확인합니다.
bin\java.exe
bin\javac.exe
bin\jar.exe
conf
include
jmods
lib
JAVA_HOME에 bin 폴더를 입력하지 마세요.
JAVA_HOME은 `C:\Program Files\Java\jdk-25`처럼 JDK 최상위 폴더를 가리키고, Path에 `%JAVA_HOME%\bin`을 추가해야 합니다.



Win + R 실행창에 입력
sysdm.cpl
시스템 속성이 열리면 고급 → 환경 변수를 선택합니다.


변수 이름
JAVA_HOME
변수 값 예시
C:\Program Files\Java\jdk-25
공백이 있어도 큰따옴표를 넣지 않습니다.
`C:\Program Files\Java\jdk-25`처럼 Program Files에 공백이 있어도 환경변수 값 자체에는 따옴표를 입력하지 않습니다.

%JAVA_HOME%\bin




Path는 위에서 아래 순서로 같은 이름의 실행 파일을 검색합니다.
따라서 `%JAVA_HOME%\bin`보다 위쪽에 다른 Java 경로가 있으면 그쪽의 `java.exe`가 먼저 실행될 수 있습니다.
다만 업무 프로그램이 특정 Java 버전을 먼저 사용하도록 구성돼 있다면 무조건 순서를 바꾸지 말고 다음 명령으로 현재 사용 중인 경로를 확인하는 것이 좋습니다.
where java
where javac

과거 Java 설정 글에서는 다음과 같은 CLASSPATH 값을 시스템 환경변수에 추가하는 경우가 많았습니다.
.;%JAVA_HOME%\lib
그러나 최신 Java 개발에서는 전역 CLASSPATH를 설정하면 프로젝트마다 사용하는 라이브러리가 섞이고, 다른 프로그램의 클래스 로딩에 영향을 줄 수 있습니다.
javac -cp "lib\example.jar" Main.java
java -cp ".;lib\example.jar" Main
기존 CLASSPATH가 있다면 바로 삭제하기 전 확인하세요.
오래된 업무 프로그램이나 배치파일이 해당 환경변수에 의존할 수 있으므로 값을 기록한 뒤 임시로 제거해 정상 작동 여부를 비교합니다.
| 구분 | 적용 범위 | 추천 환경 |
|---|---|---|
| 사용자 변수 | 현재 Windows 계정 | 개인 개발 PC·관리자 권한이 없는 계정 |
| 시스템 변수 | PC의 모든 사용자와 일부 서비스 | 공용 PC·빌드 서버·Tomcat·서비스 실행 |
개인 개발 PC라면 사용자 변수만으로 충분한 경우가 많습니다.
Jenkins, Tomcat과 Windows 서비스처럼 로그인 사용자와 다른 계정으로 실행되는 프로그램은 시스템 변수를 필요로 할 수 있습니다.
같은 이름의 변수가 사용자와 시스템에 모두 있으면 혼동될 수 있습니다.
JAVA_HOME이 두 곳에 서로 다른 값으로 등록돼 있다면 현재 계정과 서비스가 다른 JDK를 사용할 수 있으므로 한쪽으로 정리하세요.
환경변수 창을 수정하기 전에 현재 터미널에서만 임시로 JDK를 바꿔 테스트할 수 있습니다.
set "JAVA_HOME=C:\Program Files\Java\jdk-25"
set "PATH=%JAVA_HOME%\bin;%PATH%"
java -version
javac -version
CMD 창을 닫으면 임시 설정은 사라집니다.
$env:JAVA_HOME = "C:\Program Files\Java\jdk-25"
$env:Path = "$env:JAVA_HOME\bin;$env:Path"
java -version
javac -version
PowerShell 창을 닫으면 기존 Windows 환경변수로 돌아갑니다.
임시 설정을 먼저 권장하는 이유
JAVA_HOME과 Path를 영구 변경하기 전 해당 JDK에서 프로그램이 정상적으로 실행되는지 안전하게 테스트할 수 있습니다.
아래 예제는 현재 Windows 사용자에게 JAVA_HOME과 Path를 영구 등록합니다. 실행 전 실제 JDK 경로로 변경합니다.
$javaHome = "C:\Program Files\Java\jdk-25"
if (-not (Test-Path "$javaHome\bin\javac.exe")) {
throw "지정한 JDK 경로에서 javac.exe를 찾을 수 없습니다: $javaHome"
}
[Environment]::SetEnvironmentVariable(
"JAVA_HOME",
$javaHome,
"User"
)
$javaPathEntry = "%JAVA_HOME%\bin"
$currentUserPath = [Environment]::GetEnvironmentVariable("Path", "User")
$pathItems = @(
$currentUserPath -split ";" |
Where-Object {
$_ -and
$_.Trim() -ne $javaPathEntry -and
$_.Trim() -notmatch "\\Java\\jdk-[^\\]+\\bin\\?$"
}
)
$newUserPath = ($javaPathEntry + ";" + ($pathItems -join ";")).TrimEnd(";")
[Environment]::SetEnvironmentVariable(
"Path",
$newUserPath,
"User"
)
Write-Host "JAVA_HOME과 사용자 Path 설정이 완료됐습니다."
Write-Host "PowerShell과 CMD를 모두 닫고 새 창에서 확인하세요."
시스템 Path 전체를 setx로 덮어쓰지 마세요.
`setx PATH ...` 명령을 잘못 사용하면 기존 프로그램 경로가 확장·누락되거나 중복될 수 있습니다. GUI 또는 PowerShell의 환경변수 API를 사용하는 편이 안전합니다.

환경변수는 프로그램이 시작될 때 상위 프로세스로부터 전달됩니다.
설정 전에 열어둔 CMD, PowerShell, Eclipse와 IntelliJ는 이전 값을 계속 사용할 수 있으므로 모두 닫고 다시 실행합니다.
echo %JAVA_HOME%
where java
where javac
java -version
javac -version

java -XshowSettings:properties -version 2>&1 | findstr "java.home"
결과에 표시되는 `java.home`이 JAVA_HOME과 같은 JDK 계열을 가리키는지 확인합니다.
Get-Command java -All
Get-Command javac -All
java와 javac 버전이 다르면 설정 충돌입니다.
`java -version`은 Java 8인데 `javac -version`은 Java 25처럼 다르게 표시되면 Path에 여러 JDK 또는 JRE 경로가 섞여 있는지 확인하세요.
버전 명령만 확인하지 말고 작은 Java 파일을 직접 컴파일해보면 JDK 설정을 확실하게 검증할 수 있습니다.
public class Hello {
public static void main(String[] args) {
System.out.println("Java 환경변수 설정 완료");
System.out.println("Java Version: " + System.getProperty("java.version"));
System.out.println("Java Home: " + System.getProperty("java.home"));
}
}
javac Hello.java
같은 폴더에 `Hello.class`가 만들어지면 컴파일러가 정상 작동한 것입니다.
java Hello
파일명이 아닌 클래스 이름을 입력하므로 `java Hello.class`라고 실행하지 않습니다.
최신 JDK에서는 간단한 소스 파일을 별도 컴파일 명령 없이 실행할 수도 있습니다.
java Hello.java
다만 `javac` 환경까지 검증하려면 컴파일과 실행을 따로 진행하는 편이 좋습니다.
'java'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
echo %JAVA_HOME%
dir "%JAVA_HOME%\bin\java.exe"
where java
두 번째 명령에서 파일을 찾지 못하면 JAVA_HOME 경로를 수정해야 합니다.
'javac'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
`java -version`은 작동하지만 `javac -version`만 실패하면 다음 가능성을 확인합니다.
dir "%JAVA_HOME%\bin\javac.exe"
파일이 없다면 올바른 JDK 패키지를 다시 설치합니다.
Maven, Gradle과 Tomcat을 실행할 때 다음과 비슷한 오류가 나타날 수 있습니다.
JAVA_HOME is not defined correctly.
This environment variable is needed to run this program.
JAVA_HOME=C:\Program Files\Java\jdk-25\bin
JAVA_HOME="C:\Program Files\Java\jdk-25"
JAVA_HOME=C:\Program Files\Java\삭제된-jdk
JAVA_HOME=C:\Program Files\Java\jdk-25
mvn -version
Maven 출력의 Java version과 runtime이 원하는 JDK를 가리키는지 확인합니다.
gradle -version
Gradle Daemon이 이전 JDK를 계속 사용한다면 IDE와 터미널을 닫은 뒤 데몬을 중지합니다.
gradle --stop
새 JDK를 설치했는데 `java -version`에서 이전 버전이 표시되면 대부분 Path 순서 문제입니다.
where java
where javac
결과가 여러 줄이라면 첫 번째 경로의 실행 파일이 사용됩니다.
C:\Program Files\Common Files\Oracle\Java\javapath
C:\Program Files\Java\jdk-8\bin
C:\Program Files\Java\jdk-17\bin
C:\Program Files\Java\jdk-25\bin
C:\Windows\System32
프로그램 폴더의 java.exe를 임의로 삭제하지 마세요.
일부 프로그램은 자체 포함된 Java Runtime을 사용합니다. 해당 파일을 삭제하면 프로그램만 실행되지 않을 수 있습니다.
Java 8, 17, 21과 25처럼 여러 버전을 설치해 프로젝트별로 사용해야 할 수 있습니다.
set "JAVA_HOME=C:\Program Files\Java\jdk-17"
set "PATH=%JAVA_HOME%\bin;%PATH%"
java -version
javac -version
$env:JAVA_HOME = "C:\Program Files\Java\jdk-25"
$env:Path = "$env:JAVA_HOME\bin;" + (($env:Path -split ";") |
Where-Object { $_ -notmatch "\\Java\\jdk-[^\\]+\\bin\\?$" } |
ForEach-Object { $_.Trim() } |
Where-Object { $_ } |
Select-Object -Unique) -join ";"
java -version
javac -version
시스템 JAVA_HOME을 매번 바꾸는 것보다 빌드 도구의 Toolchain 기능을 사용하는 편이 여러 프로젝트 관리에 유리합니다.
Windows의 JAVA_HOME을 변경해도 Eclipse가 자동으로 같은 JDK를 사용하는 것은 아닙니다.
Window → Preferences → Java → Installed JREs
IDE 오류가 모두 환경변수 문제는 아닙니다.
Eclipse와 IntelliJ는 자체 설정에 등록된 JDK를 사용할 수 있으므로 JAVA_HOME, Project SDK와 빌드 도구 JVM을 각각 확인해야 합니다.
File → Project Structure → Project → SDK
Settings → Build, Execution, Deployment → Build Tools → Gradle → Gradle JVM
Project SDK는 JDK 25인데 Gradle JVM은 JDK 17로 지정돼 있으면 터미널과 IDE 빌드 결과가 다를 수 있습니다.
Android Studio는 자체 포함된 JetBrains Runtime을 사용하며 Android Gradle Plugin 버전에 따라 지원 JDK가 정해집니다.
일반 Java 환경변수를 최신 JDK로 변경했다고 Android 프로젝트의 Gradle JDK까지 무조건 바꾸면 빌드 오류가 발생할 수 있습니다.
Settings → Build, Execution, Deployment → Build Tools → Gradle → Gradle JDK
| 증상 | 가능성이 높은 원인 | 해결방법 |
|---|---|---|
| 기존 CMD에서만 이전 값 | 실행 중 프로세스가 기존 환경변수 유지 | CMD·PowerShell 완전 종료 후 재실행 |
| java와 javac 버전이 다름 | Path에 여러 Java 경로가 등록 | where java·where javac 확인 |
| Maven만 다른 JDK 사용 | Maven 실행환경 또는 IDE 설정 | mvn -version과 IDE Maven JDK 확인 |
| 서비스만 JAVA_HOME 인식 안 함 | 사용자 변수에만 등록 | 시스템 변수·서비스 계정 확인 |
| Eclipse에서 컴파일 오류 | IDE JDK·컴파일 레벨 불일치 | Installed JREs와 Compiler 확인 |
| JDK 업데이트 후 경로 없음 | 기존 패치 버전 폴더가 제거됨 | 실제 설치 폴더로 JAVA_HOME 수정 |
| 특정 프로그램만 실행 안 됨 | 프로그램이 자체 Java 경로나 특정 버전 요구 | 프로그램 공식 지원 Java 확인 |
잘못 등록한 JAVA_HOME과 Path를 정리하려면 삭제 전 기존 값을 메모하거나 화면을 캡처합니다.
[Environment]::SetEnvironmentVariable(
"JAVA_HOME",
$null,
"User"
)
Path의 `%JAVA_HOME%\bin`은 환경 변수 편집 화면에서 별도로 제거합니다.
Java 관련 Path를 모두 지우지 마세요.
Android Studio, 데이터베이스, CAD와 업무 프로그램이 자체 Java 실행경로를 사용하고 있을 수 있으므로 항목별 용도를 확인합니다.
JAVA_HOME·Path 체크리스트
① JDK를 설치했는지 확인
② 실제 JDK 폴더에 bin\javac.exe가 있는지 확인
③ JAVA_HOME은 JDK 최상위 폴더로 지정
④ JAVA_HOME 값에 bin과 따옴표 제외
⑤ Path에는 %JAVA_HOME%\bin 추가
⑥ 전역 CLASSPATH는 가급적 설정하지 않음
⑦ 중복된 Java Path 제거
⑧ 기존 터미널과 IDE 종료 후 재실행
⑨ where java와 where javac 경로 비교
⑩ java -version과 javac -version 일치 확인
아닙니다. JAVA_HOME에는 `C:\Program Files\Java\jdk-25`처럼 JDK 최상위 폴더를 입력하고, Path에 `%JAVA_HOME%\bin`을 추가합니다.
환경변수 값에는 큰따옴표를 넣지 않습니다. Program Files처럼 공백이 포함된 경로도 그대로 입력합니다.
일반적인 최신 Java 개발에서는 설정하지 않는 것이 권장됩니다. 프로젝트의 라이브러리는 `-cp`, Maven, Gradle 또는 IDE 설정으로 관리하세요.
실행환경은 확인할 수 있지만 컴파일러까지 정상이라는 뜻은 아닙니다. `javac -version`과 `where javac`도 함께 확인해야 합니다.
JRE만 설치됐거나 Path가 런타임 폴더만 가리키는 상태일 수 있습니다. JDK의 `bin\javac.exe` 존재 여부와 `%JAVA_HOME%\bin`을 확인하세요.
기존 CMD를 닫고 새로 실행한 뒤 `where java`를 확인합니다. 여러 결과가 나오면 첫 번째 경로가 실제로 실행되는 Java입니다.
JAVA_HOME은 사용자가 Windows에 등록하는 환경변수이고, `java.home`은 실행 중인 JVM이 자신의 실제 런타임 위치를 나타내는 Java 시스템 속성입니다.
현재 사용자만 Java를 사용한다면 사용자 변수로 충분합니다. Windows 서비스, 공용 PC와 여러 사용자에게 적용하려면 시스템 변수를 사용합니다.
최신 기능을 바로 사용할 환경이면 JDK 26을 선택할 수 있습니다. 장기간 안정적으로 운영할 새 프로젝트라면 최신 LTS인 JDK 25가 일반적으로 관리하기 편합니다.
프로그램마다 다릅니다. 오래된 프로그램은 Java 8 전용 API, 인증서, JVM 옵션과 32비트 환경을 요구할 수 있으므로 공식 지원 버전을 확인해야 합니다.
Windows 환경변수가 아니라 Eclipse의 Installed JREs, Java Build Path와 Compiler Compliance Level 문제일 수 있습니다.
`mvn -version`에서 Java home을 확인하세요. IDE가 Maven을 실행할 때 별도의 JDK를 지정하거나 Maven Toolchains를 사용하는 경우가 있습니다.
기존 패치 버전 폴더가 제거되고 새 폴더가 만들어졌을 수 있습니다. `C:\Program Files\Java`에서 실제 폴더를 확인하고 JAVA_HOME을 수정하세요.
JDK의 전체 경로를 직접 입력하면 가능합니다. 또한 자체 Runtime을 포함해 배포된 프로그램은 시스템 JAVA_HOME이나 Path를 사용하지 않을 수도 있습니다.
윈도우11 자바 환경변수 설정의 핵심은 JAVA_HOME에 정확한 JDK 최상위 폴더를 지정하고 Path에 `%JAVA_HOME%\bin`을 추가하는 것입니다.
JAVA_HOME에는 `bin` 폴더나 큰따옴표를 넣지 말고, 파일 탐색기에서 확인한 실제 JDK 설치경로를 입력해야 합니다.
과거에 자주 사용하던 전역 CLASSPATH는 여러 프로젝트와 프로그램에 예기치 않은 영향을 줄 수 있으므로 일반적인 최신 Java 개발에서는 등록하지 않는 편이 좋습니다.
설정 후에는 기존 CMD와 IDE를 닫고 새로 실행한 뒤 `where java`, `where javac`, `java -version`과 `javac -version`을 순서대로 확인하세요.
새 버전을 설치했는데 이전 Java가 실행된다면 Path에 여러 Java 경로가 남아 있는지 확인하고, 첫 번째로 검색되는 실행 파일을 원하는 JDK로 정리해야 합니다.
Eclipse, IntelliJ, Android Studio, Maven과 Gradle은 Windows JAVA_HOME과 별도로 자체 JDK 설정을 사용할 수 있으므로 터미널은 정상인데 IDE에서만 오류가 발생한다면 프로젝트 SDK와 빌드 JVM도 함께 확인해야 합니다.
Java 공식 설치 및 명령어 문서
Oracle JDK 다운로드 OpenJDK 다운로드 Windows JDK 설치 java 명령어 javac·CLASSPATH 안내 Java 시작 가이드| 맥북 M1·M2 윈도우11 설치방법|UTM 무료 가상머신 ARM64 설정 (0) | 2026.08.07 |
|---|---|
| 윈도우11 25H2 블랙스크린·IRQL_NOT_LESS_OR_EQUAL 해결|설치 인터넷 오류 (0) | 2026.08.07 |
| 크롬 쿠키 캐시 삭제방법|시크릿모드·게스트모드 차이와 개인정보 설정 (0) | 2026.08.07 |