コマンドラインからjava .classを実行する方法


113

コンパイルされたjavaクラスがあります。

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定義を探す場所)

その場合は、dirの内容の一覧が表示されます。

Echo.java
Echo.class

次に、これのいずれかが機能する可能性があります:

java -cp . Echo "hello"

または

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

後でFredrikが指摘するように、別のエラーメッセージが表示されます。

スレッド「メイン」の例外java.lang.NoSuchMethodError:main

それが起こったら、彼の答えを読んでください:)


2
-cp。追加する必要があることをJavaに伝える。(現在の作業ディレクトリ)からクラスパスへ、つまり彼がコードを探している場所を意味します。
Fredrik、

16

クラスパスを指定する必要があります。これはそれを行うはずです:

java -cp . Echo "hello"

これは.、クラスパス(つまり、クラスを探す場所)として(現在のディレクトリ)を使用するようにjavaに指示します。パッケージを使用する場合は、クラスパスにパッケージのサブディレクトリではなくルートディレクトリを含める必要があることに注意してください。たとえば、クラスが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]);
    }
}

編集:あなたが行方不明であるという点でオスカーも正しいことに注意してください。あなたのクラスパスでは、あなたはそのエラーに対処した後で私が解決する問題に出くわすでしょう。


15

Java 11を使用すれば、このきわどい問題を解決する必要はもうありません。

代わりに、これを行うことができます:

> java MyApp.java

すべてを1つのステップで完了するため、事前にコンパイルする必要はありません。

ここで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. 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

クラス名の前に、現在のディレクトリとパッケージ名に注意してください。それは私のLinuxミントで動作し、私は他のOSでも期待しています

スタックオーバーフローに感謝します。


1
注意:クラスファイルは./mypackage/hello.class名前で見つけられるべきです。「コマンドラインからパッケージでJavaを実行する」の質問も参照してください。
ruvim

2

私の状況は少し複雑でした。JNIコード用にresourcesディレクトリで.dllを使用していたため、3つのステップを実行する必要がありました。私のファイルは

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コンパイラを使用してクラスをコンパイルしましたか?次に、メインメソッドのシグネチャが正しくないようです-1つだけではなく、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.