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


113

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

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 코드를 가져 오는 가장 간단한 방법은 무엇입니까?


14
제안 : 답변을 무효화하지 않도록 빠른 검토를 통해 원래 질문을 수정하지 않은 상태로 두는 것이 좋습니다. 올바른 메서드 시그니처를보고 그것이 틀렸다고 말하는 많은 답변을 보는 것이 정말 이상합니다. 최소한 올바른 버전과의 비교를 위해 잘못된 코드가 남아 있어야합니다.
JSmyth 2014

답변:


119

시험:

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 예외

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


2
-cp. Java에. (현재 작업 디렉토리)를 클래스 경로에 추가합니다.
Fredrik

16

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

java -cp . Echo "hello"

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


15

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

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

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

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

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


15

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

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

> java MyApp.java

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

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


> 복사 C : \ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java. / y && javac MyApp.java && java -cp. MyApp && del MyApp.class && del MyApp.java 어떤 사람들은 구식 방식을 선호합니다 =)
Jr.

3

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에 감사드립니다.


1
주의 : 클래스 파일은 ./mypackage/hello.class이름을 통해 찾을 수 있어야합니다 . 참조 : " 명령 줄에서 패키지의 Java 실행 "질문.
ruvim

2

제 상황은 조금 복잡했습니다. 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 

0

먼저 명령 줄 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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.