Error: Could not find or load main class HelloWorld

Jang990·2023년 2월 7일
0

오류 정리

해당 상황은 Java의 전체적인 흐름을 확인하다 생긴 오류입니다.

오류 상황


다음과 같은 폴더 구조에서 HelloWorld!를 콘솔에 출력하는 아주 간단한 예시를 사용했습니다.

HelloWorld.java파일을 만든 후 이클립스에서 Ctrl+F11을 눌러 실행했습니다. 그래서 HelloWorld.class파일이 bin폴더에 생성된 것을 확인했습니다.

그리고 Cmd에서 bin\javaprocess 폴더로 이동해서 HelloWorld.class를 다음과 같이 실행했을 때 에러가 발생했습니다.

C:\...\User>cd C:\...\JavaStudy\bin\javaprocess

C:\...\JavaStudy\bin\javaprocess>java HelloWorld
Error: Could not find or load main class HelloWorld
Caused by: java.lang.NoClassDefFoundError: javaprocess/HelloWorld (wrong name: HelloWorld)



해결 방안

bin 폴더로 이동해서 java 패키지명.Class명 명령어를 실행하면 정상적으로 실행됩니다.

1. bin 폴더로 이동
C:\...\JavaStudy\bin\javaprocess> cd ..

2. 명령어 실행
C:\...\JavaStudy\bin\> java javaprocess.HelloWorld

Hello World!


또는 classpath를 bin 폴더로 지정하고 java 패키지명.클래스명 명령어를 실행하면 정상 실행됩니다.

1.cmd 실행 - classpath를 지정하므로 bin 폴더로 이동할 필요가 없음

2. 명령어 실행
C:\...\User>java -classpath C:\Users\User\Desktop\JavaStudy\JavaStudy\bin javaprocess.HelloWorld

Hello World!



발생 이유

아래와 같은 폴더 구조를 가지고 있고, HelloWorld 에서 DependentClass를 의존하고 있다 가정한다면 모든 하위 패키지가 포함되어 있는 폴더를 기준으로 명령어를 실행을 시켜야 합니다.

public class DependentClass {
	public void methodFromDependentClass() {
        System.out.println("Hello World! from the dependent class");
    }
}
package javaprocess;

import another.DependentClass;

public class HelloWorld {
	
	public static void main(String[] args) {
		System.out.println("Hello World!");
		
        // HelloWorld 내에서 another.DependentClass를 사용하고 있음
		DependentClass dc = new DependentClass();
		dc.methodFromDependentClass();
	}

}

왜냐하면 위 사진과 같이 HelloWorld 에서 DependentClass를 의존하고 있다면 HelloWorld.class뿐만 아니라 다른 패키지에 존재하는 DependentClass.class를 실행시켜야 합니다.


꼭 bin 폴더에서 실행시켜야 할까?

앞서 말했듯 모든 하위 패키지가 포함되어 있는 폴더를 기준으로 명령어를 실행을 시켜야 합니다. 그러므로 꼭 bin 폴더일 필요는 없습니다.

하지만 주의할 점은 해당 폴더에 관련된 모든 패키지 폴더와 .class 파일이 정상적으로 들어 있는지 확인해야 합니다.

다음과 같이 임의의 폴더에 관련 패키지 폴더와 .class 파일들을 이동시키고 실행하면 정상적으로 실행하는 것을 확인할 수 있습니다.

하지만 바이트 코드를 소스 코드에서 분리하는 것이 일반적인 규칙이기 때문에 .class파일과 .java파일을 정확하게 구분해서 폴더를 관리해야 합니다.

파일을 분리한다면 소스 코드와 컴파일된 코드를 명확하게 구분할 수 있으므로 혼동을 피하고 파일 관리가 더 쉬워집니다.

profile
공부한 내용을 적지 말고 이해한 내용을 설명하자

0개의 댓글