자바(Java)에서 코드의 최종 실행은 미리 컴파일된 클래스를 통해 이루어집니다. 자바로 클래스를 작성하면 컴파일러가 고수준 소스 코드를 바이트코드(bytecode)라 불리는 저수준 형식으로 변환합니다. 작성한 각 클래스마다 사전에 컴파일된 바이트코드가 생성되며, 이 바이트코드에는 JVM(자바 가상 머신)에서 실행할 수 있는 저수준 코드가 담겨 있습니다.
그런데 가끔 터미널에서 java 명령어를 실행했을 때 could not find or load main class와 같은 오류 메시지가 출력되는 경우가 있습니다. 이는 클래스의 바이트코드에 문제가 있다는 의미입니다. 그렇다면 어떻게 해결해야 할까요? 지금부터 자세히 알아보겠습니다.
'could not find or load main class' 오류란 무엇일까요?
could not find or load main class 오류는 코드 설계상의 문제가 있음을 나타냅니다. 주로 다음과 같은 명령어로 자바 프로그램을 실행할 때 발생합니다.
java Test
여기서 "Test"는 실행할 코드가 담긴 클래스의 이름입니다. 만약 could not find or load main class 오류가 발생한다면, Test 클래스의 바이트코드를 찾지 못했다는 뜻입니다.
'could not find or load main class' 오류 해결 방법
이 오류를 해결하는 방법은 여러 가지가 있습니다. could not find or load main class 오류를 진단하고 수정하는 대표적인 방법들을 살펴보겠습니다.
1. 오타 확인하기
이 오류의 첫 번째 원인으로 의심해볼 것은 오타입니다. 프로그램 실행 명령어는 "java"와 클래스 이름 두 가지 요소로만 구성되기 때문에, 실제로 실수할 수 있는 부분은 클래스 이름뿐입니다. 만약 "java" 키워드 자체에 오타가 있다면 명령줄에서 "command not found"라는 명확한 오류가 표시됩니다.
따라서 클래스 이름에 오타가 없는지 꼼꼼히 확인해 보세요. 대부분의 경우 이런 오류는 단순한 철자나 입력 실수에서 비롯됩니다.
예를 들어 "Test.java" 파일에 "Test"라는 클래스를 작성했다고 가정해 보겠습니다. 일반적으로 명령줄에서 다음과 같이 컴파일합니다.
javac Test.java
그다음 아래 명령어로 실행합니다.
java Test
이렇게 하면 프로그램이 정상적으로 실행됩니다. 하지만 위 명령어에서 "Test"를 잘못 입력하면 Could not find or load main class 오류가 발생할 수 있습니다.
2. 잘못된 클래스패스(Classpath) 설정
애플리케이션의 클래스패스 문제로도 이 오류가 발생할 수 있습니다. 클래스패스(CLASSPATH)는 시스템 내에서 사용자 클래스가 저장된 위치를 가리키는 환경 변수입니다. 클래스패스가 가리키는 디렉터리에는 코드에서 직접 가져와 사용할 수 있는 여러 사전 작성된 클래스들이 들어 있습니다.
예를 들어 다음과 같은 import 문을 작성했다고 가정해 보겠습니다.
import org.company.Foo;
이 코드를 실행하면 JVM은 <classpath>/org/company/Foo.java 위치에서 "Foo" 클래스를 찾습니다. 즉, 클래스패스가 잘못된 경로를 가리키고 있다면 JVM은 원하는 클래스를 절대 찾을 수 없으며, 결국 could not find or load main class 오류를 발생시키게 됩니다.
때로는 클래스패스에 프로그램이 의존하는 모든 시스템 클래스가 포함되어 있지 않은 경우도 있습니다. 즉, 아직 다운로드하거나 설정하지 않은 패키지의 클래스를 포함하려고 하는 상황일 수 있습니다. 이 경우에도 동일한 오류가 발생합니다.
3. 클래스가 잘못된 패키지에 선언된 경우
소스 코드 파일 상단에 작성된 패키지(package) 선언이 클래스가 실제로 선언된 패키지 또는 모듈과 일치하지 않으면 이 오류가 발생합니다. 대부분의 IDE는 린팅(linting) 과정에서 오류를 표시해 주기 때문에 쉽게 파악할 수 있지만, 이를 놓치면 위와 같은 오류로 이어질 수 있습니다.
이 문제의 가장 좋은 해결책은 항상 클래스의 패키지 이름이 올바른 패키지를 가리키는지 확인하는 것입니다. IntelliJ나 VSCode 같은 고급 IDE를 사용한다면 이 문제를 감지하는 린팅 기능을 활성화해 두는 것이 좋습니다.
예를 들어 project/src/com/foo/bar 경로에 저장된 다음 클래스를 살펴보겠습니다.
package com.foo.baz;
class Bar {
// Some code here
}
위 코드에서 패키지는 com/foo/baz를 가리키지만, 클래스는 실제로 com/foo/bar에 저장되어 있습니다. 이를 수정하려면 package 문을 올바른 패키지를 가리키도록 변경해야 합니다.
package com.foo.bar;
class Bar {
// Some code here
}
마무리
이번 글에서는 자바의 Could not find or load main class 오류가 무엇인지, 그리고 왜 발생하는지 알아보았습니다. 또한 이 오류를 해결하는 대표적인 방법으로 오타 확인, 클래스패스 점검, 패키지 선언 검토를 살펴보았습니다.
자바로 프로그래밍을 하다 보면 이 오류가 종종 나타날 수 있습니다. 오류 메시지가 다소 어려워 보일 수 있지만, 사실 해결하기 어렵지 않습니다. 찾으려는 클래스가 올바른 위치에 있는지만 확인하면 됩니다.