새로운 Java 개발자가 경험하는 일반적인 문제는 프로그램이 다음 오류 메시지와 함께 실행 Could not find or load main class ...
이것이 의미하는 바는 무엇이며 원인은 무엇이며 어떻게 수정해야 합니까?
질문자 :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
명령이 다음을 수행하도록 합니다.
com.acme.example.ListUsers
클래스의 컴파일된 버전을 검색합니다.public static void main(String[])
제공하는 서명 , 반환 유형 및 수정자가 main
메서드가 있는지 확인합니다. (메소드 인수의 이름은 서명의 일부 가 아닙니다.)String[]
합니다. "메인 클래스를 찾거나 로드할 수 없습니다..."라는 메시지가 표시되면 첫 번째 단계가 실패했음을 의미합니다. java
명령이 클래스를 찾을 수 없습니다. 그리고 실제로 메시지의 "..."는 java
가 찾고 있는 완전한 클래스 이름이 될 것입니다.
그렇다면 클래스를 찾을 수 없는 이유는 무엇입니까?
첫 번째 가능한 원인은 잘못된 클래스 이름을 제공했을 수 있다는 것입니다. (또는 ... 올바른 클래스 이름이지만 잘못된 형식입니다.) 위의 예를 고려할 때 클래스 이름을 지정 하는 다양한 잘못된 방법이 있습니다.
예제 #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
두 번째 가능한 원인은 클래스 이름이 정확하지만 java
명령이 클래스를 찾을 수 없기 때문입니다. 이것을 이해하려면 "classpath"의 개념을 이해해야 합니다. 이것은 Oracle 문서에 잘 설명되어 있습니다.
java
명령 문서따라서 ... 클래스 이름을 올바르게 지정했다면 다음으로 확인할 사항은 클래스 경로를 올바르게 지정했는지 확인하는 것입니다.
java
명령을 실행할 때 적용되는 명령줄 및/또는 CLASSPATH 환경 변수를 살펴보십시오. 디렉토리 이름과 JAR 파일 이름이 올바른지 확인하십시오.java
명령을 실행할 때 유효한 현재 디렉토리에서 올바르게 해석되는지 확인하십시오.;
:
입니다. 플랫폼에 잘못된 구분 기호를 사용하면 명시적인 오류 메시지가 표시되지 않습니다. 대신 경로에 존재하지 않는 파일이나 디렉토리가 표시됩니다. 조용히 무시합니다.) 클래스 경로에 디렉토리를 배치하면 개념적으로 규정된 이름 공간의 루트에 해당합니다. 클래스는 정규화된 이름을 경로 이름에 매핑하여 해당 루트 아래의 디렉토리 구조에 있습니다. 따라서 예를 들어 "/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이 클래스를 찾을 수 없습니다.
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
대한 각각의 수동 항목을 확인하십시오.클래스 경로에는 애플리케이션이 의존하는 다른 모든(시스템이 아닌) 클래스가 포함되어야 합니다. (시스템 클래스는 자동으로 위치하므로 이에 대해 신경 쓸 필요가 거의 없습니다.) 기본 클래스가 올바르게 로드되려면 JVM이 다음을 찾아야 합니다.
(참고: JLS 및 JVM 사양은 JVM이 클래스를 "느리게" 로드할 수 있는 일부 범위를 허용하며 이는 클래스 로더 예외가 발생하는 시기에 영향을 미칠 수 있습니다.
누군가 소스 코드 파일을 소스 코드 트리의 잘못된 폴더에 넣거나 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 프로그램을 시작하기 위한 세 가지 대체 구문이 있습니다.
"실행 가능한" JAR 파일을 시작하는 데 사용되는 구문은 다음과 같습니다.
java [ <options> ] -jar <jar-file-name> [<arg> ...]
예
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
진입점 클래스의 이름(예: com.acme.example.ListUser
)과 클래스 경로는 JAR 파일의 MANIFEST에 지정됩니다.
모듈(Java 9 이상)에서 애플리케이션을 시작하는 구문은 다음과 같습니다.
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
진입점 클래스의 이름은 <module>
<mainclass>
의해 제공됩니다.
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 다시 시작, 프로젝트 재구축 등과 같은 다른 작업을 시도해 볼 가치가 있습니다.
소스 코드 이름이 HelloWorld.java인 경우 컴파일된 코드는 HelloWorld.class
됩니다.
다음을 사용하여 호출하면 해당 오류가 발생합니다.
java HelloWorld.class
대신 다음을 사용하십시오.
java HelloWorld
수업은 패키지에있는 경우에 당신은에있는 cd
프로젝트의 루트 디렉토리와 클래스 (packageName.MainClassName)의 정규화 된 이름을 사용하여 실행합니다.
예시:
내 수업은 다음과 같습니다.
D:\project\com\cse\
내 주 클래스의 정규화된 이름은 다음과 같습니다.
com.cse.Main
I에 따라서 cd
루트 프로젝트 디렉터리에 다시 :
D:\project
그런 다음 java
명령을 실행합니다.
java com.cse.Main
이 답변은 일반적인 실수로 인한 좌절감에서 초보 자바 프로그래머를 구하는 것입니다. Java 클래스 경로에 대한 자세한 지식은 허용되는 답변을 읽는 것이 좋습니다.
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
동일한 코드가 한 PC에서 작동하지만 다른 PC에서 오류가 표시되는 경우 내가 찾은 최고의 솔루션은 다음과 같이 컴파일하는 것입니다.
javac HelloWorld.java java -cp . HelloWorld
나에게 도움이 된 것은 명령줄에서 클래스 경로를 지정하는 것이었습니다. 예를 들면 다음과 같습니다.
새 폴더 생성 C:\temp
C:\temp
에 다음 클래스가 포함된 Temp.java 파일을 만듭니다.
public class Temp { public static void main(String args[]) { System.out.println(args[0]); } }
C:\temp
폴더에서 명령줄을 열고 다음 명령을 작성하여 Temp 클래스를 컴파일합니다.
javac Temp.java
컴파일된 Java 클래스를 실행하고 -classpath
옵션을 추가하여 JRE가 클래스를 찾을 위치를 알 수 있도록 합니다.
java -classpath C:\temp Temp Hello!
오류 메시지("메인 클래스를 찾거나 로드할 수 없음")에 따르면 두 가지 범주의 문제가 있습니다.
정규화된 클래스 이름에 오타 또는 잘못된 구문이 있거나 제공된 클래스 경로에 존재하지 않는 경우 기본 클래스를 찾을 수 없습니다.
클래스를 시작할 수 없는 경우 기본 클래스를 로드 할 수 없습니다 . 일반적으로 기본 클래스는 다른 클래스를 확장하고 해당 클래스는 제공된 클래스 경로에 존재하지 않습니다.
예를 들어:
public class YourMain extends org.apache.camel.spring.Main
camel-spring이 포함되지 않은 경우 이 오류가 보고됩니다.
다음 명령을 사용하십시오.
java -cp . [PACKAGE.]CLASSNAME
예: 클래스 이름이 Hello.java에서 생성된 Hello.class인 경우 아래 명령을 사용합니다.
java -cp . Hello
Hello.java 파일이 com.demo 패키지 안에 있으면 아래 명령을 사용하십시오.
java -cp . com.demo.Hello
JDK 8을 사용하면 클래스 파일이 동일한 폴더에 있는 경우가 여러 번 발생하지만 java
명령은 클래스 경로를 예상하고 이러한 이유로 -cp .
현재 폴더를 클래스 경로에 대한 참조로 사용합니다.
이 경우에는 다음과 같은 오류가 발생했습니다.
java -cp lib.jar com.mypackage.Main
그것은 함께 작동합니다 ;
Windows용 및 :
Unix용:
java -cp lib.jar; com.mypackage.Main
-Xdiag 를 시도하십시오.
Steve C의 답변 은 가능한 경우를 잘 다루지만 때로는 클래스를 찾 거나 로드 할 수 없는지 여부를 결정하는 것이 쉽지 않을 수 있습니다. java -Xdiag
사용하십시오(JDK 7부터). Could not find or load main class
메시지가 의미하는 바에 대한 힌트를 제공하는 멋진 스택 추적을 출력합니다.
예를 들어, 찾을 수 없고 메인 클래스가 로드되지 못하게 하는 메인 클래스에서 사용하는 다른 클래스를 가리킬 수 있습니다.
때로는 문제의 원인이 될 수 있는 것이 메인 클래스와 관련이 없기 때문에 어려운 방법으로 찾아야 했습니다. 내가 이사한 것은 참조 라이브러리였으며 다음을 제공했습니다.
기본 클래스 xxx Linux를 찾거나 로드할 수 없습니다.
방금 해당 참조를 삭제하고 다시 추가했는데 다시 잘 작동했습니다.
나는 같은 문제가 있었고 마침내 내 실수를 발견했습니다 :) 컴파일을 위해이 명령을 사용했고 올바르게 작동했습니다.
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
이 경우 다음이 있습니다.
기본 클래스 ?classpath를 찾거나 로드할 수 없습니다.
"-classpath"를 사용하고 있지만 대시는 명령 프롬프트에서 java
메모장 에서 cmd로 복사하여 붙여넣는 문제가 있었습니다.
필자의 경우 클래스 이름 대신 소스 파일 이름을 제공했기 때문에 오류가 발생했습니다.
인터프리터에 main 메소드를 포함하는 클래스 이름을 제공해야 합니다.
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>
이것은 귀하의 사례가 특히 나와 같은 경우 도움이 될 수 있습니다. 초보자로서 Java 프로그램을 실행하려고 할 때 이 문제에 부딪쳤습니다.
나는 그것을 다음과 같이 컴파일했다.
javac HelloWorld.java
그리고 같은 확장자로도 실행하려고 했습니다.
java Helloworld.java
.java
제거하고 java HelloWorld
와 같은 명령을 다시 작성하면 프로그램이 완벽하게 실행되었습니다. :)
여기에 있는 모든 답변은 Windows 사용자를 대상으로 한 것 같습니다. Mac의 경우 클래스 경로 구분 기호는 :
과 ;
. 다음을 사용하여 클래스 경로를 설정하는 동안 오류가 발생했습니다 ;
던져지지 않으면 Windows에서 Mac으로 오는 경우 발견하기 어려울 수 있습니다.
다음은 해당 Mac 명령입니다.
java -classpath ".:./lib/*" com.test.MyClass
이 예에서 패키지는 com.test
이고 lib
폴더도 클래스 경로에 포함됩니다.
클래스 파일 위치: C:\test\com\company
파일 이름: Main.class
정규화된 클래스 이름: com.company.Main
명령줄 명령:
java -classpath "C:\test" com.company.Main
여기서 클래스 경로에는 \com\company가 포함되지 않습니다.
나는 이 문제를 해결하기 위해 상당한 시간을 보냈다. 어떻게 든 클래스 경로를 잘못 설정하고 있다고 생각했지만 문제는 다음을 입력했다는 것입니다.
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
대신에:
java -cp C:/java/MyClasses utilities/myapp/Cool
나는 정규화의 의미가 전체 패키지 이름 대신 전체 경로 이름을 포함하는 것을 의미한다고 생각했습니다.
이것은 특정한 경우이지만 해결책을 찾기 위해 이 페이지에 왔는데 찾지 못했기 때문에 여기에 추가합니다.
Windows(7에서 테스트됨)는 클래스 및 패키지 이름에 á
하지만 리눅스는 그렇습니다.
.jar
을 빌드하고 명령줄에서 실행하려고 할 때 이것을 발견했습니다. NetBeans에서는 실행되었지만 명령줄에서는 실행되지 않았습니다.
내 경우의 문제를 해결한 것은 다음과 같습니다.
실행하려는 프로젝트/클래스를 마우스 오른쪽 버튼으로 클릭한 다음 Run As
-> Run Configurations
합니다. 그런 다음 기존 구성을 수정하거나 다음과 같은 방법으로 새로 추가해야 합니다.
Classpath
탭을 열고 Advanced...
버튼을 클릭한 다음 프로젝트의 bin
폴더를 추가하십시오.
Windows에서 .;
시작 부분의 CLASSPATH 값에서.
NS . (점)은 "현재 디렉토리에서 보기"를 의미합니다. 이것은 영구적인 솔루션입니다.
CLASSPATH=%CLASSPATH%;.
사용하여 "한 번" 설정할 수 있습니다. . 이것은 cmd 창이 열려 있는 동안 지속됩니다.
먼저 이 명령을 사용하여 경로를 설정하십시오.
set path="paste the set path address"
그런 다음 프로그램을 로드해야 합니다. 저장된 드라이브에 "cd(폴더 이름)"를 입력하고 컴파일합니다. 예를 들어 내 프로그램이 D 드라이브에 저장된 경우 "D:"를 입력하고 Enter 키를 누르고 " cd(폴더 이름)"를 입력합니다.
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/
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
-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가 클래스 경로 인수를 올바르게 처리할 수 있습니다.
또한 Java MongoDB JDBC 연결을 테스트하는 동안 유사한 오류에 직면했습니다. 나는 미래에 누구든지 두 명령을 직접 살펴보고 더 진행할 수 있도록 최종 솔루션을 간단히 요약하는 것이 좋다고 생각합니다.
Java 파일 및 외부 종속성(JAR 파일)이 있는 디렉토리에 있다고 가정합니다.
엮다:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
운영:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
좋아요, 이미 많은 답변이 있지만 파일 권한이 범인이 될 수 있는 경우를 언급한 사람은 아무도 없습니다.
실행 중일 때 사용자는 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에게는 여전히 오류가 발생합니다.
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" />
여기에 설명된 솔루션으로 이 문제를 해결할 수 없었습니다(설명된 답변이 의심의 여지 없이 내 개념을 지웠음에도 불구하고). 나는 이 문제에 두 번 직면했고 매번 다른 솔루션을 시도했습니다(Eclipse IDE에서).
main
그래서 후속 클래스에서 main
메소드를 삭제했습니다.출처 : http:www.stackoverflow.com/questions/18093928/what-does-could-not-find-or-load-main-class-mean
Git 리포지토리의 하위 디렉터리만 복제하려면 어떻게 합니까? (0) | 2022.01.22 |
---|---|
경고: push.default가 설정되지 않았습니다. 암시적 값은 Git 2.0에서 변경됩니다. (0) | 2022.01.22 |
JavaScript 객체에 키/값 쌍을 추가하려면 어떻게 해야 합니까? (0) | 2022.01.22 |
PHP의 startsWith() 및 endsWith() 함수 (0) | 2022.01.22 |
macOS 또는 OS X에 pip를 어떻게 설치합니까? (0) | 2022.01.22 |