[java] 명령 줄에서 java .class를 실행하는 방법

컴파일 된 자바 클래스가 있습니다.

Echo.class

public class Echo {
    public static void main (String arg) {

            System.out.println(arg);
    }
}

I cd디렉토리로 이동하여 다음을 입력합니다.java Echo "hello"

이 오류가 발생합니다.

C:\Documents and Settings\joe\My Documents\projects\Misc\bin>java Echo "hello"
Exception in thread "main" java.lang.NoClassDefFoundError: Echo
Caused by: java.lang.ClassNotFoundException: Echo
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Echo.  Program will exit.

Eclipse IDE를 사용해야하는 것처럼 명령 줄에서 실행할 수있는 형식으로 Java 코드를 가져 오는 가장 간단한 방법은 무엇입니까?



답변

시험:

java -cp . Echo "hello"

다음으로 컴파일했다고 가정합니다.

javac Echo.java 

그러면 “현재”디렉토리가 클래스 경로에 없을 가능성이 있습니다 (java가 .class 정의를 찾습니다).

이 경우 디렉토리의 내용이 표시되는 경우 :

Echo.java
Echo.class

그러면 다음 중 하나가 작동 할 수 있습니다.

java -cp . Echo "hello"

또는

SET CLASSPATH=%CLASSPATH;.

java Echo "hello"

나중에 Fredrik이 지적한 것처럼 다른 오류 메시지가 표시됩니다.

스레드 “main”java.lang.NoSuchMethodError : main 예외

그럴 때 가서 그의 대답을 읽으십시오 🙂


답변

클래스 경로를 지정해야합니다. 이렇게해야합니다.

java -cp . Echo "hello"

이것은 자바가 .(현재 디렉토리)를 클래스 경로, 즉 클래스를 찾는 장소 로 사용하도록 지시 합니다. 패키지를 사용할 때 클래스 경로에는 패키지 하위 디렉터리가 아닌 루트 디렉터리가 포함되어야합니다. 예를 들어 클래스가 my.package.Echo이고 .class 파일이 bin/my/package/Echo.class이면 올바른 클래스 경로 디렉토리는 bin입니다.


답변

유효한 기본 메서드가 없습니다 … 서명은 다음과 같아야합니다. public static void main ( String [] args);

따라서 귀하의 경우 코드는 다음과 같습니다.

public class Echo {
    public static void main (String[] arg) {

            System.out.println(arg[0]);
    }
}

편집 : 당신이 누락되었다는 점에서 Oscar 가 옳다는 점에 유의하십시오 . 클래스 경로에서 해당 오류를 처리 한 후 내가 해결하는 문제에 부딪 힐 것입니다.


답변

Java 11을 사용하면이 rigmarole을 더 이상 거치지 않아도됩니다!

대신 다음을 수행 할 수 있습니다.

> java MyApp.java

모든 것이 한 단계로 완료되므로 미리 컴파일 할 필요가 없습니다.

여기에서 Java 11 JDK를 얻을 수 있습니다. JDK 11 GA 릴리스


답변

Java 소스에있는 경우

package mypackage;

클래스는 hello.java입니다.

public class hello {

그리고 그 hello.java에서 당신은

 public static void main(String[] args) {

그런 다음 (컴파일 후) changeDir (cd)를 hello.class가있는 디렉토리로 변경합니다. 그때

java -cp . mypackage.hello

클래스 이름 앞에 현재 디렉토리와 패키지 이름을 유의하십시오. 그것은 내 리눅스 민트에서 작동하며 다른 OS에서도 희망합니다.

풍부한 정보에 대해 Stack overflow에 감사드립니다.


답변

제 상황은 조금 복잡했습니다. JNI 코드를 위해 resources 디렉토리에서 .dll을 사용하고 있었기 때문에 세 단계를 수행해야했습니다. 내 파일은

S:\Accessibility\tools\src\main\resources\dlls\HelloWorld.dll
S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class

내 코드에는 다음 줄이 포함되었습니다.

System.load(HelloWorld.class.getResource("/dlls/HelloWorld.dll").getPath());

먼저 클래스 경로 디렉토리로 이동해야했습니다.

cd /D "S:\Accessibility\tools\src\test\java"

다음으로 클래스 경로를 현재 디렉터리를 가리 키도록 변경하여 클래스가로드되도록해야하고 클래스 경로를 리소스 디렉터리를 가리 키도록 변경하여 dll이로드되도록해야했습니다.

set classpath=%classpath%;.;..\..\..\src\main\resources; 

그런 다음 클래스 이름을 사용하여 Java를 실행해야했습니다.

java com.accessibility.HelloWorld 


답변

먼저 명령 줄 javac 컴파일러를 사용하여 클래스를 컴파일 했습니까? 둘째, 기본 메서드에 잘못된 서명이있는 것 같습니다. 하나가 아닌 String 개체의 배열을 받아야합니다.

public static void main(String[] args){

String 객체의 배열을 받아들이도록 코드를 변경 한 후에는 배열 자체가 아닌 배열의 요소를 인쇄하고 있는지 확인해야합니다.

System.out.println(args[0])

명령 줄 인수의 전체 목록을 인쇄하려면 루프를 사용해야합니다.

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();