답변:
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
클래스를 검색하십시오 .main
과 방법 서명 , 반환 형식 및 수정 에 의해 주어진을 public static void main(String[])
. (메소드 인수의 이름은 서명의 일부 가 아닙니다 .)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
. 디렉토리 이름과 JAR 파일 이름이 올바른지 확인하십시오.java
명령.;
Windows 및 :
기타에 있습니다. 플랫폼에 잘못된 구분 기호를 사용하면 명시적인 오류 메시지가 표시되지 않고 경로에 존재하지 않는 파일이나 디렉토리가 자동으로 무시됩니다. .)클래스 경로에 디렉토리를 놓으면, 규정 된 이름 공간의 루트에 해당됩니다. 정규화 된 이름을 pathname에 매핑하여 클래스는 해당 루트 아래의 디렉토리 구조에 있습니다. 예를 들어, "/ 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
옵션을 단축 할 수 있습니다 -cp
대부분의 자바 버전에서. 에 대한 각각의 매뉴얼 항목을 확인 java
, javac
등등을.클래스 경로에는 응용 프로그램이 의존 하는 다른 (시스템이 아닌) 클래스가 모두 포함 되어야합니다. (시스템 클래스는 자동으로 위치하므로 이에 대해 거의 신경 쓸 필요가 없습니다.) 기본 클래스가 올바르게로드 되려면 JVM에서 다음을 찾아야합니다.
(참고 : JLS 및 JVM 스펙에서는 JVM이 클래스를 "지연하게"로드 할 수있는 일부 범위가 있으며 이는 클래스 로더 예외가 발생하는 경우 영향을 줄 수 있습니다.
누군가가 소스 코드 파일을 소스 코드 트리의 잘못된 폴더에 넣거나 package
선언을 생략하는 경우가 있습니다. IDE에서이 작업을 수행하면 IDE의 컴파일러에서이를 즉시 알려줍니다. 마찬가지로 적절한 Java 빌드 도구를 사용하는 경우 도구는 javac
문제점을 감지하는 방식으로 실행 됩니다. 그러나 Java 코드를 직접 작성하는 경우 컴파일러가 문제점을 인식하지 못하는 방식으로 수행 할 수 있으며 결과 ".class"파일이 예상 한 위치에 있지 않습니다.
확인할 사항이 많으며 놓치기 쉽습니다. 명령 행에 -Xdiag
옵션을 추가하십시오 java
(첫 번째로 java
). 클래스 로딩에 대한 다양한 것들을 출력 할 것이고, 이것은 실제 문제가 무엇인지에 대한 단서를 제공 할 수 있습니다.
또한 웹 사이트, 문서 등에서 보이지 않거나 ASCII가 아닌 문자를 복사하여 붙여 넣을 때 발생할 수있는 문제를 고려하십시오. 그리고 "상형 문자"를 고려하면 두 글자 또는 기호가 동일하게 보이지만 그렇지 않습니다.
마지막으로에서 잘못된 서명을 가진 JAR 파일에서 시작하려고하면 분명히이 문제가 발생할 수 있습니다 (META-INF/*.SF)
.
java
를 사용하여 Java 프로그램을 시작하기위한 세 가지 대체 구문이 java command
있습니다.
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>
자체적으로 정의 되거나 optional에 의해 제공됩니다 <mainclass>
.
3) Java 11부터 단일 소스 코드 파일을 컴파일 및 실행하고 다음 구문으로 실행할 수 있습니다.
java [ <options> ] <sourcefile> [<arg> ...]
여기서 (일반적으로) 접미사가 ".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 다시 시작, 프로젝트 다시 작성 등과 같은 다른 작업을 시도해 볼 가치가 있습니다.
java -cp ../third-party-library.jar com.my.package.MyClass
; 이것은 작동하지 않습니다. 대신 클래스 경로에 로컬 폴더를 추가해야합니다 (으로 구분 :
: java -cp ../third-party-library.jar:. com.my.package.MyClass
다음 과 같이 작동합니다)
java
가져온 클래스를 찾지 못한다고 말하는 것이 슬프지만 대신 실행하려는 기본 클래스입니다. 나는 그 이유가 있다고 확신하지만 오해의 소지가 있습니다. java
클래스가 어디에 있는지 정확히 알고 있었지만 가져온 클래스 중 하나를 찾지 못했습니다. 그 말을하는 대신, 나는 나의 주요 반을 찾지 못한다는 불평을했다. 진짜로
소스 코드 이름이 HelloWorld.java 인 경우 컴파일 된 코드는입니다 HelloWorld.class
.
다음을 사용하여 호출하면 해당 오류가 발생합니다.
java HelloWorld.class
대신 이것을 사용하십시오 :
java HelloWorld
javac TestCode.java
다음을 수행했습니다.java TestCode
java -classpath . HelloWorld
수업이 패키지에 있다면 당신은에 있습니다cd
프로젝트의 루트 디렉토리와 클래스 (packageName.MainClassName)의 정규화 된 이름을 사용하여 실행합니다.
예:
내 수업은 다음과 같습니다.
D:\project\com\cse\
메인 클래스의 정규화 된 이름은 다음과 같습니다.
com.cse.Main
그래서 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
directory와 같은 패키지에 배치해야합니다 ./com/test/Main.Java
. 그리고 루트 디렉토리에서을 사용하십시오 java com.test.Main
.
동일한 코드가 한 PC에서 작동하지만 다른 PC에서 오류가 표시되면 내가 찾은 최고의 솔루션은 다음과 같이 컴파일하는 것입니다.
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
일했을 것 입니다! 그리고 그것은 당신의 경우에 더 나은 해결책입니다.
명령 줄에서 클래스 경로를 지정하는 데 도움이 된 것은 다음과 같습니다.
새 폴더를 만들고 C:\temp
C:\temp
에 다음 클래스와 함께 Temp.java 파일을 작성하십시오 .
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
folder에서 명령 행을 열고 C:\temp
다음 명령을 작성하여 Temp 클래스를 컴파일하십시오.
javac Temp.java
컴파일 된 Java 클래스를 실행하고 -classpath
JRE에 클래스를 찾을 위치를 알려주 는 옵션을 추가하십시오 .
java -classpath C:\temp Temp Hello!
java
당신이 클래스 경로 설정이 아니었다 환경에 설정되어 있지 -classpath 또는 -jar) 또는 2)를 사용하기 때문에 ($ CLASSPATH보고되지 않은 효과 맥락에서 java
였다 운영; 예를 들어 오른쪽 쉘에서 setenv 명령을 추가 한 파일을 "소스"하지 않았기 때문입니다.
오류 메시지 ( "메인 클래스를 찾거나로드 할 수 없습니다")에 따르면 두 가지 범주의 문제가 있습니다.
메인 클래스는 할 수없는 발견 이있을 때 오타 나 잘못된 구문이 정규화 된 클래스 이름에 있거나 제공된 클래스 경로에 존재하지 않는 .
클래스를 시작할 수 없을 때 메인 클래스를 로드 할 수 없습니다 . 일반적으로 기본 클래스는 다른 클래스를 확장하고 해당 클래스가 제공된 클래스 경로에 없습니다.
예를 들면 다음과 같습니다.
public class YourMain extends org.apache.camel.spring.Main
낙타 스프링이 포함되어 있지 않으면이 오류가보고됩니다.
extends
). 난 그냥 메인 클래스가 실패 할 때하는 어려운 방법 배운 부하 가 될 수있는 또 다른 확장 때문에 발견을 , 자바는 찾을 수 없습니다 실제 어떤 클래스보고하지 않습니다 (달리를 NoClassDefFoundError
). 그래서 그렇습니다. 그리고 당신이 이것을 모르는 것은 머리를 찌르는 상황입니다.
-Xdiag 시도 하십시오 .
Steve C의 대답 은 가능한 경우를 훌륭하게 다루지 만 때로는 클래스를 찾을 수 없거나 로드 할 수 있는지 여부를 결정하는 것이 쉽지 않을 수도 있습니다. java -Xdiag
JDK 7부터 사용하십시오 . 메시지 Could not find or load main class
메시지의 의미에 대한 힌트를 제공하는 멋진 스택 추적을 인쇄 합니다.
예를 들어, 메인 클래스가 사용하지 못하고 메인 클래스가로드되지 못하게하는 다른 클래스를 가리킬 수 있습니다.
이 명령을 사용하십시오 :
java -cp . [PACKAGE.]CLASSNAME
예 : 클래스 이름이 Hello.java에서 작성된 Hello.class 인 경우 아래 명령을 사용하십시오.
java -cp . Hello
파일 Hello.java가 com.demo 패키지 안에 있으면 아래 명령을 사용하십시오
java -cp . com.demo.Hello
JDK 8을 사용하면 클래스 파일이 동일한 폴더에 존재하지만 java
명령에 클래스 경로가 필요하기 때문에 -cp .
현재 폴더를 클래스 경로의 참조로 사용하도록 추가 합니다.
-cp .
불필요합니다. $CLASSPATH
설정되어 .
있지 않으면 기본 클래스 경로입니다.
echo %CLASSPATH%
출력 은 무엇입니까 ?) 그리고 아니요, Windows PC가 없기 때문에 확인할 수 없습니다.
때때로 문제를 일으키는 것은 메인 클래스와 아무 관련이 없으며, 이것을 어려운 방법으로 찾아야했습니다. 내가 옮긴 참조 라이브러리 였고 나에게 다음을 주었다.
주 클래스 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
귀하의 사례가 특히 내 것과 같은 경우 도움이 될 수 있습니다. 초보자로서 Java 프로그램을 실행하려고 할 때도이 문제가 발생했습니다.
나는 이것을 다음과 같이 컴파일했다.
javac HelloWorld.java
그리고 나는 같은 확장으로 실행하려고했습니다.
java Helloworld.java
를 제거하고 .java
와 같은 명령을 다시 작성 java HelloWorld
하면 프로그램이 완벽하게 실행되었습니다. :)
여기에있는 모든 답변은 Windows 사용자를 대상으로합니다. Mac의 경우 클래스 경로 구분 기호는 :
아닙니다 ;
. 클래스 경로를 사용하여 오류를 설정하면 오류 ;
가 발생하지 않으므로 Windows에서 Mac으로 올 경우 발견하기가 어려울 수 있습니다.
해당 Mac 명령은 다음과 같습니다.
java -classpath ".:./lib/*" com.test.MyClass
이 예제에서 패키지가 com.test
있고 lib
폴더도 클래스 경로에 포함됩니다.
/*
필요한가요?
나는이 문제를 해결하기 위해 상당한 시간을 보냈다. 어떻게 든 클래스 경로를 잘못 설정했다고 생각했지만 문제는 내가 입력 한 것입니다.
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
대신에:
java -cp C:/java/MyClasses utilities/myapp/Cool
정규화 된 의미는 전체 패키지 이름 대신 전체 경로 이름을 포함하는 것으로 생각했습니다.
utilities.myapp.Cool
패키지 이름이 있거나 무엇이든 관계없이 제공되어야합니다 .
먼저이 명령을 사용하여 경로를 설정하십시오.
set path="paste the set path address"
그런 다음 프로그램을로드해야합니다. 저장된 드라이브에 "cd (폴더 이름)"을 입력하고 컴파일하십시오. 예를 들어, 프로그램이 D 드라이브에 저장된 경우 "D :"를 입력하고 Enter를 누르고 "cd (폴더 이름)"을 입력하십시오.
if "cd" helps then it by luck rather than by judgement
. java .
가 기본적으로 현재 디렉토리 를 클래스 경로의 일부로 사용하기 때문에 이것은 잘못입니다 (믿습니다) .
당신이 사용하는 경우 메이븐을 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>
Windows .;
에서는 처음에 CLASSPATH 값을 입력하십시오.
. (점)은 "현재 디렉토리를 봅니다"를 의미합니다. 이것은 영구적 인 해결책입니다.
또한 set을 사용하여 "한 번만"설정할 수 CLASSPATH=%CLASSPATH%;.
있습니다. cmd 창이 열려있는 한 지속됩니다.
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
cd
으로 src
다음 명령을 실행합니다 java ../bin com.blah.blah.MyClass
날 위해 일했습니다. 팁 주셔서 감사합니다!
Java에서 때로는 Java 실행 파일을 사용하여 명령 행에서 JVM을 실행하고 공용 정적 무효 주 (PSVM)를 사용하여 클래스 파일에서 프로그램을 시작하려고 할 때 classpath 매개 변수가 다음과 같은 경우에도 아래 오류가 발생할 수 있습니다. JVM이 정확하고 클래스 파일이 클래스 경로에 있습니다.
Error: main class not found or loaded
PSVM이있는 클래스 파일을로드 할 수없는 경우에 발생합니다. 그 이유 중 하나는 클래스가 인터페이스를 구현하거나 클래스 경로에없는 다른 클래스를 확장 할 수 있기 때문입니다. 일반적으로 클래스가 클래스 경로에 없으면 발생 된 오류가 그와 같이 나타납니다. 그러나 사용중인 클래스가 확장되거나 구현 된 경우 java는 클래스 자체를로드 할 수 없습니다.
참조 : https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/
Windows PowerShell에서 보급 된 옵션을 사용 하여 java
with를 실행하면 -cp
다음과 같은 오류가 발생할 수 있습니다.
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
JavaMongoDBConnection
패키지가 없으며 2) 디렉토리를 변경하지 않는다고 가정합니다 . 말하자면, 깨지기 쉬운 것입니다. 그리고 문제를 설명하지 않으면 초보자가 작동하지 않는 상황 에서이 접근법을 시도 하게됩니다 . 간단히 말해, "부두 프로그래밍 기술"을 권장합니다. en.wikipedia.org/wiki/Voodoo_programming
이미 많은 답변이 있지만 파일 권한이 범인이 될 수있는 사례는 아무도 언급하지 않았습니다.
실행시, 사용자는 JAR 파일 또는 경로의 디렉토리 중 하나에 액세스 할 수 없습니다. 예를 들어, 다음을 고려하십시오.
Jar 파일 /dir1/dir2/dir3/myjar.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
후속 클래스 에서 메소드를 삭제했습니다 .main
메소드를 삭제 해도 문제가 해결되지 않습니다. 여러 진입 점이있는 응용 프로그램에는 기술적으로 문제가 없습니다.