etc./StackOverFlow

"메인 클래스를 찾거나 로드할 수 없음"은 무엇을 의미합니까?

청렴결백한 만능 재주꾼 2022. 1. 22. 07:12
반응형

질문자 :Stephen C


새로운 Java 개발자가 경험하는 일반적인 문제는 프로그램이 다음 오류 메시지와 함께 실행 Could not find or load main class ...

이것이 의미하는 바는 무엇이며 원인은 무엇이며 어떻게 수정해야 합니까?



java <class-name> 명령 구문

java (또는 javaw ) 명령을 사용하여 프로그램을 시작하는 올바른 방법을 이해해야 합니다.

일반 구문 1 은 다음과 같습니다.

 java [ <options> ] <class-name> [<arg> ...]

여기서 <option> 은 명령줄 옵션("-" 문자로 시작)이고, <class-name> 은 정규화된 Java 클래스 이름이며, <arg> 는 애플리케이션에 전달되는 임의의 명령줄 인수입니다.


1 - 이 답변의 끝 부분에 설명된 몇 가지 다른 구문이 있습니다.

클래스의 FQN(정규화된 이름)은 일반적으로 Java 소스 코드에서와 같이 작성됩니다. 예

 packagename.packagename2.packagename3.ClassName

java 명령의 일부 버전에서는 마침표 대신 슬래시를 사용할 수 있습니다. 예

 packagename/packagename2/packagename3/ClassName

(혼란스럽게도) 파일 경로 이름처럼 보이지만 그렇지 않습니다. 정규화 된 이름 이라는 용어는 표준 Java 용어입니다 ... 당신을 혼란스럽게하기 위해 만든 것이 아닙니다 :-)

java 명령의 모양에 대한 예입니다.

 java -Xmx100m com.acme.example.ListUsers fred joe bert

위의 내용은 java 명령이 다음을 수행하도록 합니다.

  1. com.acme.example.ListUsers 클래스의 컴파일된 버전을 검색합니다.
  2. 클래스를 로드합니다.
  3. public static void main(String[]) 제공하는 서명 , 반환 유형수정자가 main 메서드가 있는지 확인합니다. (메소드 인수의 이름은 서명의 일부 가 아닙니다.)
  4. 해당 메서드를 호출하여 명령줄 인수("fred", "joe", "bert")를 String[] 합니다.

Java가 클래스를 찾을 수 없는 이유

"메인 클래스를 찾거나 로드할 수 없습니다..."라는 메시지가 표시되면 첫 번째 단계가 실패했음을 의미합니다. java 명령이 클래스를 찾을 수 없습니다. 그리고 실제로 메시지의 "..."는 java 가 찾고 있는 완전한 클래스 이름이 될 것입니다.

그렇다면 클래스를 찾을 수 없는 이유는 무엇입니까?

이유 #1 - 클래스 이름 인수에 실수를 했습니다.

첫 번째 가능한 원인은 잘못된 클래스 이름을 제공했을 수 있다는 것입니다. (또는 ... 올바른 클래스 이름이지만 잘못된 형식입니다.) 위의 예를 고려할 때 클래스 이름을 지정 하는 다양한 잘못된 방법이 있습니다.

  • 예제 #1 - 간단한 클래스 이름:

     java ListUser

    com.acme.example 과 같은 패키지에서 선언 java 명령에 패키지 이름을 포함 하는 전체 클래스 이름을 사용해야 합니다. 예

     java com.acme.example.ListUser
  • 예제 #2 - 클래스 이름이 아닌 파일 이름 또는 경로 이름:

     java ListUser.class java com/acme/example/ListUser.class
  • 예제 #3 - 대소문자가 잘못된 클래스 이름:

     java com.acme.example.listuser
  • 예 #4 - 오타

     java com.acme.example.mistuser
  • 예제 #5 - 소스 파일 이름(Java 11 이상 제외, 아래 참조)

     java ListUser.java
  • 예제 #6 - 클래스 이름을 완전히 잊어버렸습니다.

     java lots of arguments

이유 #2 - 응용 프로그램의 클래스 경로가 잘못 지정되었습니다.

두 번째 가능한 원인은 클래스 이름이 정확하지만 java 명령이 클래스를 찾을 수 없기 때문입니다. 이것을 이해하려면 "classpath"의 개념을 이해해야 합니다. 이것은 Oracle 문서에 설명되어 있습니다.

따라서 ... 클래스 이름을 올바르게 지정했다면 다음으로 확인할 사항은 클래스 경로를 올바르게 지정했는지 확인하는 것입니다.

  1. 위에 링크된 세 문서를 읽으십시오. (예... 읽어보세요! Java 프로그래머가 최소한 Java 클래스 경로 메커니즘이 작동하는 방식에 대한 기본 사항을 이해하는 것이 중요합니다.)
  2. java 명령을 실행할 때 적용되는 명령줄 및/또는 CLASSPATH 환경 변수를 살펴보십시오. 디렉토리 이름과 JAR 파일 이름이 올바른지 확인하십시오.
  3. 클래스 경로에 상대 java 명령을 실행할 때 유효한 현재 디렉토리에서 올바르게 해석되는지 확인하십시오.
  4. 클래스(오류 메시지에 언급됨)가 유효한 클래스 경로에 있는지 확인하십시오.
  5. 클래스 경로 구문은 Windows와 Linux 및 Mac OS에서 다릅니다. (클래스 경로 구분 기호는 Windows의 경우 ; : 입니다. 플랫폼에 잘못된 구분 기호를 사용하면 명시적인 오류 메시지가 표시되지 않습니다. 대신 경로에 존재하지 않는 파일이나 디렉토리가 표시됩니다. 조용히 무시합니다.)

이유 #2a - 잘못된 디렉토리가 클래스 경로에 있습니다.

클래스 경로에 디렉토리를 배치하면 개념적으로 규정된 이름 공간의 루트에 해당합니다. 클래스는 정규화된 이름을 경로 이름에 매핑하여 해당 루트 아래의 디렉토리 구조에 있습니다. 따라서 예를 들어 "/usr/local/acme/classes"가 클래스 경로에 있으면 JVM이 com.acme.example.Foon 이라는 클래스를 찾을 때 다음이 포함된 ".class" 파일을 찾습니다. 경로명:

 /usr/local/acme/classes/com/acme/example/Foon.class

클래스 경로에 "/usr/local/acme/classes/com/acme/example"을 넣으면 JVM이 클래스를 찾을 수 없습니다.

이유 #2b - 하위 디렉토리 경로가 FQN과 일치하지 않습니다.

FQN 클래스가 com.acme.example.Foon 인 경우 JVM은 "com/acme/example" 디렉토리에서 "Foon.class"를 찾습니다.

  • 디렉토리 구조가 위의 패턴에 따라 패키지 이름과 일치하지 않으면 JVM이 클래스를 찾지 못합니다.

  • 클래스를 이동하여 이름을 바꾸려고 하면 그것도 실패하지만 ... 예외 스택 추적은 다릅니다. 다음과 같이 말할 수 있습니다.

     Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)

    클래스 파일의 FQN이 클래스 로더가 찾을 것으로 예상하는 것과 일치하지 않기 때문입니다.

구체적인 예를 들면 다음과 같습니다.

  • com.acme.example.Foon 클래스를 실행하려면
  • 전체 파일 경로는 /usr/local/acme/classes/com/acme/example/Foon.class .
  • 현재 작업 디렉토리는 /usr/local/acme/classes/com/acme/example/ .

그 다음에:

 # wrong, FQN is needed java Foon # wrong, there is no `com/acme/example` folder in the current working directory java com.acme.example.Foon # wrong, similar to above java -classpath . com.acme.example.Foon # fine; relative classpath set java -classpath ../../.. com.acme.example.Foon # fine; absolute classpath set java -classpath /usr/local/acme/classes com.acme.example.Foon

노트:

  • -classpath 옵션은 대부분의 Java 릴리스에서 -cp 로 단축될 수 있습니다. java , javac 대한 각각의 수동 항목을 확인하십시오.
  • 클래스 경로에서 절대 경로 이름과 상대 경로 이름을 선택할 때 신중하게 생각하십시오. 현재 디렉토리가 변경되면 상대 경로 이름이 "중단"될 수 있음을 기억하십시오.

이유 #2c - 클래스 경로에서 누락된 종속성

클래스 경로에는 애플리케이션이 의존하는 다른 모든(시스템이 아닌) 클래스가 포함되어야 합니다. (시스템 클래스는 자동으로 위치하므로 이에 대해 신경 쓸 필요가 거의 없습니다.) 기본 클래스가 올바르게 로드되려면 JVM이 다음을 찾아야 합니다.

(참고: JLS 및 JVM 사양은 JVM이 클래스를 "느리게" 로드할 수 있는 일부 범위를 허용하며 이는 클래스 로더 예외가 발생하는 시기에 영향을 미칠 수 있습니다.

이유 #3 - 클래스가 잘못된 패키지에서 선언되었습니다.

누군가 소스 코드 파일을 소스 코드 트리의 잘못된 폴더에 넣거나 package 선언을 생략하는 경우가 있습니다. IDE에서 이 작업을 수행하면 IDE의 컴파일러에서 이에 대해 즉시 알려줍니다. 마찬가지로 적절한 Java 빌드 도구를 사용하는 경우 도구는 문제를 감지하는 방식으로 javac 그러나 Java 코드를 손으로 빌드하는 경우 컴파일러가 문제를 인식하지 못하는 방식으로 수행할 수 있으며 결과 ".class" 파일이 예상한 위치에 있지 않습니다.

여전히 문제를 찾을 수 없습니까?

확인해야 할 사항이 많고 놓치기 쉽습니다. 가산 시도 -Xdiag 받는 옵션 java (후 첫 일이 같은 명령 줄 java ). 클래스 로딩에 대한 다양한 정보를 출력할 것이며, 이는 실제 문제가 무엇인지에 대한 단서를 제공할 수 있습니다.

또한 웹 사이트, 문서 등에서 보이지 않거나 ASCII가 아닌 문자를 복사하여 붙여 넣을 때 발생할 수 있는 문제를 고려하십시오. 그리고 두 글자나 기호가 같아 보이지만 ... 그렇지 않은 "동형문자"를 고려하십시오.

(META-INF/*.SF) 잘못된 서명이 있는 JAR 파일에서 시작하려고 MANIFEST.MF 파일에 구문 오류가 있는 경우 (https:// 참조) 이 문제가 발생할 수 있습니다. stackoverflow.com/a/67145190/139985 ).


java 대체 구문

java command 사용하여 Java 프로그램을 시작하기 위한 세 가지 대체 구문이 있습니다.

  1. "실행 가능한" JAR 파일을 시작하는 데 사용되는 구문은 다음과 같습니다.

     java [ <options> ] -jar <jar-file-name> [<arg> ...]

     java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

    진입점 클래스의 이름(예: com.acme.example.ListUser )과 클래스 경로는 JAR 파일의 MANIFEST에 지정됩니다.

  2. 모듈(Java 9 이상)에서 애플리케이션을 시작하는 구문은 다음과 같습니다.

     java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]

    진입점 클래스의 이름은 <module> <mainclass> 의해 제공됩니다.

  3. Java 11부터는 java 명령을 사용하여 다음 구문을 사용하여 단일 소스 코드 파일을 컴파일하고 실행할 수 있습니다.

     java [ <options> ] <sourcefile> [<arg> ...]

    여기서 <sourcefile> 은 (일반적으로) 접미사가 ".java"인 파일입니다.

자세한 내용은 사용 중인 Java 릴리스 java 명령에 대한 공식 문서를 참조하십시오.


십오 일

일반적인 Java IDE는 IDE JVM 자체 또는 하위 JVM에서 Java 애플리케이션 실행을 지원합니다. 이는 일반적으로 IDE가 자체 메커니즘을 사용하여 런타임 클래스 경로를 구성하고 기본 클래스를 식별하며 java 명령줄을 생성하기 때문에 이 특정 예외로부터 영향을 받지 않습니다.

그러나 IDE 뒤에서 작업을 수행하는 경우 이 예외가 여전히 발생할 수 있습니다. 예를 들어, 이전에 Eclipse에서 Java 앱용 Application Launcher를 설정한 다음 Eclipse에 알리지 않고 "main" 클래스를 포함하는 JAR 파일을 파일 시스템의 다른 위치로 이동한 경우 Eclipse는 무의식적으로 JVM을 시작합니다. 잘못된 클래스 경로로.

간단히 말해서, IDE에서 이 문제가 발생하면 오래된 IDE 상태, 깨진 프로젝트 참조 또는 깨진 런처 구성과 같은 사항을 확인하십시오.

IDE가 단순히 혼동될 수도 있습니다. IDE는 상호 작용하는 많은 부분으로 구성된 매우 복잡한 소프트웨어 조각입니다. 이러한 부분의 대부분은 IDE를 전체적으로 반응형으로 만들기 위해 다양한 캐싱 전략을 채택합니다. 이것은 때때로 잘못될 수 있으며 가능한 한 증상은 응용 프로그램을 시작할 때 문제입니다. 이러한 일이 발생할 수 있다고 의심되는 경우 IDE 다시 시작, 프로젝트 재구축 등과 같은 다른 작업을 시도해 볼 가치가 있습니다.


기타 참조


Stephen C

소스 코드 이름이 HelloWorld.java인 경우 컴파일된 코드는 HelloWorld.class 됩니다.

다음을 사용하여 호출하면 해당 오류가 발생합니다.

 java HelloWorld.class

대신 다음을 사용하십시오.

 java HelloWorld

panoet

수업은 패키지에있는 경우에 당신은에있는 cd 프로젝트의 루트 디렉토리와 클래스 (packageName.MainClassName)의 정규화 된 이름을 사용하여 실행합니다.

예시:

내 수업은 다음과 같습니다.

 D:\project\com\cse\

내 주 클래스의 정규화된 이름은 다음과 같습니다.

 com.cse.Main

I에 따라서 cd 루트 프로젝트 디렉터리에 다시 :

 D:\project

그런 다음 java 명령을 실행합니다.

 java com.cse.Main

이 답변은 일반적인 실수로 인한 좌절감에서 초보 자바 프로그래머를 구하는 것입니다. Java 클래스 경로에 대한 자세한 지식은 허용되는 답변을 읽는 것이 좋습니다.


tharinduwijewardane

패키지 포함

package 키워드가 있는 경우(메인 클래스는 패키지에 정의되어 있음) packageName.MainClassName )을 사용하여 계층적 디렉토리에서 이를 실행해야 합니다.

소스 코드 파일(Main.java)이 있다고 가정합니다.

 package com.test; public class Main { public static void main(String[] args) { System.out.println("salam 2nya\n"); } }

이 코드를 실행하려면 다음과 같은 패키지에 Main.Class

C:\Users\workspace\testapp\com\test\Main.Java

그런 다음 터미널의 현재 디렉터리를 프로젝트의 루트 디렉터리로 변경합니다.

 cd C:\Users\workspace\testapp

마지막으로 코드를 실행합니다.

 java com.test.Main

패키지 없음

소스 코드 이름에 패키지가 없는 경우 잘못된 명령이 잘못되었을 수 있습니다. 컴파일 후 Java 파일 이름이 Main.java

 javac Main.java

컴파일된 코드는 Main.class

다음을 사용하여 호출하면 해당 오류가 발생합니다.

 java Main.class

대신 다음을 사용하십시오.

 java Main

M-Razavi

동일한 코드가 한 PC에서 작동하지만 다른 PC에서 오류가 표시되는 경우 내가 찾은 최고의 솔루션은 다음과 같이 컴파일하는 것입니다.

 javac HelloWorld.java java -cp . HelloWorld

Enamul Hassan

나에게 도움이 된 것은 명령줄에서 클래스 경로를 지정하는 것이었습니다. 예를 들면 다음과 같습니다.

  1. 새 폴더 생성 C:\temp

  2. C:\temp 에 다음 클래스가 포함된 Temp.java 파일을 만듭니다.

     public class Temp { public static void main(String args[]) { System.out.println(args[0]); } }
  3. C:\temp 폴더에서 명령줄을 열고 다음 명령을 작성하여 Temp 클래스를 컴파일합니다.

     javac Temp.java
  4. 컴파일된 Java 클래스를 실행하고 -classpath 옵션을 추가하여 JRE가 클래스를 찾을 위치를 알 수 있도록 합니다.

     java -classpath C:\temp Temp Hello!

Celebes

오류 메시지("메인 클래스를 찾거나 로드할 수 없음")에 따르면 두 가지 범주의 문제가 있습니다.

  1. 메인 클래스를 찾을 수 없습니다
  2. 기본 클래스를 로드 할 수 없습니다(이 경우 허용되는 답변에서 완전히 논의되지 않음)

정규화된 클래스 이름에 오타 또는 잘못된 구문이 있거나 제공된 클래스 경로에 존재하지 않는 경우 기본 클래스를 찾을 수 없습니다.

클래스를 시작할 수 없는 경우 기본 클래스를 로드수 없습니다 . 일반적으로 기본 클래스는 다른 클래스를 확장하고 해당 클래스는 제공된 클래스 경로에 존재하지 않습니다.

예를 들어:

 public class YourMain extends org.apache.camel.spring.Main

camel-spring이 포함되지 않은 경우 이 오류가 보고됩니다.


Devs love ZenUML

다음 명령을 사용하십시오.

 java -cp . [PACKAGE.]CLASSNAME

예: 클래스 이름이 Hello.java에서 생성된 Hello.class인 경우 아래 명령을 사용합니다.

 java -cp . Hello

Hello.java 파일이 com.demo 패키지 안에 있으면 아래 명령을 사용하십시오.

 java -cp . com.demo.Hello

JDK 8을 사용하면 클래스 파일이 동일한 폴더에 있는 경우가 여러 번 발생하지만 java 명령은 클래스 경로를 예상하고 이러한 이유로 -cp . 현재 폴더를 클래스 경로에 대한 참조로 사용합니다.


shaILU

이 경우에는 다음과 같은 오류가 발생했습니다.

 java -cp lib.jar com.mypackage.Main

그것은 함께 작동합니다 ; Windows용 및 : Unix용:

 java -cp lib.jar; com.mypackage.Main

Yamahar1sp

-Xdiag 를 시도하십시오.

Steve C의 답변 은 가능한 경우를 잘 다루지만 때로는 클래스를 거나 로드 할 수 없는지 여부를 결정하는 것이 쉽지 않을 수 있습니다. java -Xdiag 사용하십시오(JDK 7부터). Could not find or load main class 메시지가 의미하는 바에 대한 힌트를 제공하는 멋진 스택 추적을 출력합니다.

예를 들어, 찾을 수 없고 메인 클래스가 로드되지 못하게 하는 메인 클래스에서 사용하는 다른 클래스를 가리킬 수 있습니다.


jan.supol

때로는 문제의 원인이 될 수 있는 것이 메인 클래스와 관련이 없기 때문에 어려운 방법으로 찾아야 했습니다. 내가 이사한 것은 참조 라이브러리였으며 다음을 제공했습니다.

기본 클래스 xxx Linux를 찾거나 로드할 수 없습니다.

방금 해당 참조를 삭제하고 다시 추가했는데 다시 잘 작동했습니다.


Eduardo Dennis

나는 같은 문제가 있었고 마침내 내 실수를 발견했습니다 :) 컴파일을 위해이 명령을 사용했고 올바르게 작동했습니다.

 javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

그러나 이 명령은 저에게 효과가 없었습니다(메인 클래스인 qrcode 찾거나 로드할 수 없음).

 java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

마지막으로 클래스 경로 끝에 ':' 문자를 추가하고 문제가 해결되었습니다.

 java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode

Omid Mohebbi

이 경우 다음이 있습니다.

기본 클래스 ?classpath를 찾거나 로드할 수 없습니다.

"-classpath"를 사용하고 있지만 대시는 명령 프롬프트에서 java 메모장 에서 cmd로 복사하여 붙여넣는 문제가 있었습니다.


Nathan Williams

필자의 경우 클래스 이름 대신 소스 파일 이름을 제공했기 때문에 오류가 발생했습니다.

인터프리터에 main 메소드를 포함하는 클래스 이름을 제공해야 합니다.


KawaiKx

Maven 을 사용하여 JAR 파일을 빌드하는 경우 pom.xml 파일에 기본 클래스를 지정해야 합니다.

 <build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>class name us.com.test.abc.MyMainClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>

Junchen Liu

이것은 귀하의 사례가 특히 나와 같은 경우 도움이 될 수 있습니다. 초보자로서 Java 프로그램을 실행하려고 할 때 이 문제에 부딪쳤습니다.

나는 그것을 다음과 같이 컴파일했다.

 javac HelloWorld.java

그리고 같은 확장자로도 실행하려고 했습니다.

 java Helloworld.java

.java 제거하고 java HelloWorld 와 같은 명령을 다시 작성하면 프로그램이 완벽하게 실행되었습니다. :)


Ramesh Pareek

여기에 있는 모든 답변은 Windows 사용자를 대상으로 한 것 같습니다. Mac의 경우 클래스 경로 구분 기호는 :; . 다음을 사용하여 클래스 경로를 설정하는 동안 오류가 발생했습니다 ; 던져지지 않으면 Windows에서 Mac으로 오는 경우 발견하기 어려울 수 있습니다.

다음은 해당 Mac 명령입니다.

 java -classpath ".:./lib/*" com.test.MyClass

이 예에서 패키지는 com.test 이고 lib 폴더도 클래스 경로에 포함됩니다.


blue-sky

여기에 이미지 설명 입력

클래스 파일 위치: C:\test\com\company

파일 이름: Main.class

정규화된 클래스 이름: com.company.Main

명령줄 명령:

 java -classpath "C:\test" com.company.Main

여기서 클래스 경로에는 \com\company가 포함되지 않습니다.


developer747

나는 이 문제를 해결하기 위해 상당한 시간을 보냈다. 어떻게 든 클래스 경로를 잘못 설정하고 있다고 생각했지만 문제는 다음을 입력했다는 것입니다.

 java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool

대신에:

 java -cp C:/java/MyClasses utilities/myapp/Cool

나는 정규화의 의미가 전체 패키지 이름 대신 전체 경로 이름을 포함하는 것을 의미한다고 생각했습니다.


mathewbruens

이것은 특정한 경우이지만 해결책을 찾기 위해 이 페이지에 왔는데 찾지 못했기 때문에 여기에 추가합니다.

Windows(7에서 테스트됨)는 클래스 및 패키지 이름에 á 하지만 리눅스는 그렇습니다.

.jar 을 빌드하고 명령줄에서 실행하려고 할 때 이것을 발견했습니다. NetBeans에서는 실행되었지만 명령줄에서는 실행되지 않았습니다.


GuiRitter

내 경우의 문제를 해결한 것은 다음과 같습니다.

실행하려는 프로젝트/클래스를 마우스 오른쪽 버튼으로 클릭한 다음 Run As -> Run Configurations 합니다. 그런 다음 기존 구성을 수정하거나 다음과 같은 방법으로 새로 추가해야 합니다.

Classpath 탭을 열고 Advanced... 버튼을 클릭한 다음 프로젝트의 bin 폴더를 추가하십시오.


syntagma

Windows에서 .; 시작 부분의 CLASSPATH 값에서.

NS . (점)은 "현재 디렉토리에서 보기"를 의미합니다. 이것은 영구적인 솔루션입니다.

CLASSPATH=%CLASSPATH%;. 사용하여 "한 번" 설정할 수 있습니다. . 이것은 cmd 창이 열려 있는 동안 지속됩니다.


Nenad Bulatovic

먼저 이 명령을 사용하여 경로를 설정하십시오.

 set path="paste the set path address"

그런 다음 프로그램을 로드해야 합니다. 저장된 드라이브에 "cd(폴더 이름)"를 입력하고 컴파일합니다. 예를 들어 내 프로그램이 D 드라이브에 저장된 경우 "D:"를 입력하고 Enter 키를 누르고 " cd(폴더 이름)"를 입력합니다.


arun

Java에서 Java 실행 파일을 사용하여 명령줄에서 JVM을 실행하고 public static void main(PSVM)이 있는 클래스 파일에서 프로그램을 시작하려고 할 때 classpath 매개변수가 JVM이 정확하고 클래스 파일이 클래스 경로에 있습니다.

 Error: main class not found or loaded

이것은 PSVM이 있는 클래스 파일을 로드할 수 없는 경우에 발생합니다. 그 이유 중 하나는 클래스가 인터페이스를 구현하거나 클래스 경로에 없는 다른 클래스를 확장할 수 있기 때문입니다. 일반적으로 클래스가 클래스 경로에 없는 경우 발생한 오류는 해당 클래스를 나타냅니다. 그러나 사용 중인 클래스가 확장되거나 구현되면 Java는 클래스 자체를 로드할 수 없습니다.

참조: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/


Anandaraja Ravi

src 폴더에서 이 작업을 수행해야 합니다. 거기에 다음 명령줄을 입력합니다.

 [name of the package].[Class Name] [arguments]

CommandLine.class 이고 코드가 다음과 같다고 가정해 보겠습니다.

 package com.tutorialspoint.java; /** * Created by mda21185 on 15-6-2016. */ public class CommandLine { public static void main(String args[]){ for(int i=0; i<args.length; i++){ System.out.println("args[" + i + "]: " + args[i]); } } }

그럼 당신이해야 cd src 폴더와이 같을 것이다 실행하는 데 필요한 명령 :

 java com.tutorialspoint.java.CommandLine this is a command line 200 -100

명령줄의 출력은 다음과 같습니다.

 args[0]: this args[1]: is args[2]: a args[3]: command args[4]: line args[5]: 200 args[6]: -100

Mike. D

-cp 대로 -cp 옵션을 사용 java 를 실행하면 다음과 같은 오류가 발생할 수 있습니다.

 The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

PowerShell에서 명령을 수락하려면 다음과 같이 -cp 옵션의 인수를 따옴표로 묶어야 합니다.

 java -cp 'someDependency.jar;.' ClassName

이 방법으로 명령을 구성하면 Java가 클래스 경로 인수를 올바르게 처리할 수 있습니다.


Chezzwizz

또한 Java MongoDB JDBC 연결을 테스트하는 동안 유사한 오류에 직면했습니다. 나는 미래에 누구든지 두 명령을 직접 살펴보고 더 진행할 수 있도록 최종 솔루션을 간단히 요약하는 것이 좋다고 생각합니다.

Java 파일 및 외부 종속성(JAR 파일)이 있는 디렉토리에 있다고 가정합니다.

엮다:

 javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -cp - 클래스 경로 인수; 모든 종속 JAR 파일을 하나씩 전달
  • *.java - 메인 메소드가 있는 자바 클래스 파일이다. SSD

운영:

 java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • 모든 종속성 JAR 파일이 끝난 후 콜론(Unix)/쉼표(Windows)를 관찰하십시오.
  • 마지막에 확장자 없이 기본 클래스 이름을 관찰합니다(.class 또는 .java 없음).

khichar.anil

좋아요, 이미 많은 답변이 있지만 파일 권한이 범인이 될 수 있는 경우를 언급한 사람은 아무도 없습니다.

실행 중일 때 사용자는 JAR 파일 또는 경로의 디렉토리 중 하나에 액세스할 수 없습니다. 예를 들어 다음을 고려하십시오.

/dir1/dir2/dir3/myjar.jar Jar 파일

JAR 파일을 소유한 User1은 다음을 수행할 수 있습니다.

 # Running as User1 cd /dir1/dir2/dir3/ chmod +r myjar.jar

그러나 여전히 작동하지 않습니다.

 # Running as User2 java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram Error: Could not find or load main class MyProgram

실행 중인 사용자(User2)는 dir1, dir2, javalibs 또는 dir3에 대한 액세스 권한이 없기 때문입니다. User1이 파일을 볼 수 있고 파일에 액세스할 수 있을 때 누군가를 미치게 할 수 있지만 User2에게는 여전히 오류가 발생합니다.


biocyberman

mvn eclipse:eclipse 수행한 후 이 오류가 발생했습니다. 이것은 내 .classpath 파일을 약간 엉망으로 만들었습니다.

.classpath 의 행을 다음에서 변경해야 했습니다.

 <classpathentry kind="src" path="src/main/java" including="**/*.java"/> <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

에게

 <classpathentry kind="src" path="src/main/java" output="target/classes" /> <classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />

Jaanus

여기에 설명된 솔루션으로 이 문제를 해결할 수 없었습니다(설명된 답변이 의심의 여지 없이 내 개념을 지웠음에도 불구하고). 나는 이 문제에 두 번 직면했고 매번 다른 솔루션을 시도했습니다(Eclipse IDE에서).

  • 첫째, 내 프로젝트의 다른 클래스에서 main 그래서 후속 클래스에서 main 메소드를 삭제했습니다.
  • 둘째, 다음 솔루션을 시도했습니다.
    1. 내 기본 프로젝트 디렉토리를 마우스 오른쪽 버튼으로 클릭하십시오.
    2. 소스로 이동한 다음 정리하고 기본 설정과 마침을 유지합니다. 몇 가지 백그라운드 작업이 끝나면 기본 프로젝트 디렉토리로 이동합니다.
    3. 그런 다음 프로젝트를 닫고 다시 열고 붐, 마침내 내 문제를 해결했습니다.

Anus Kaleem

출처 : http:www.stackoverflow.com/questions/18093928/what-does-could-not-find-or-load-main-class-mean

반응형