新しいJava開発者が経験する一般的な問題は、彼らのプログラムがエラーメッセージで実行に失敗するということです:Could not find or load main class ...
これはどういう意味ですか、原因は何ですか、またどのように修正すればよいですか?
ソースコード名がHelloWorld.Javaの場合、コンパイル済みコードはHelloWorld.class
になります。
あなたがそれを使用してそれを呼び出すと、あなたはそのエラーになります:
Java HelloWorld.class
代わりに、これを使ってください。
Java HelloWorld
クラスがパッケージ内にある場合は、メインディレクトリにcd
して、クラスのフルネーム(packageName.MainClassName)を使用して実行する必要があります。
例:
私のクラスはここにあります:
D:\project\com\cse\
私のメインクラスのフルネームは次のとおりです。
com.cse.Main
cd
をメインディレクトリに戻します。
D:\project
それからJava
コマンドを発行します。
Java com.cse.Main
メインクラスとメインメソッドを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
のようなパッケージに./com/test/Main.Java
を配置する必要があります。そしてルートディレクトリでJava com.test.Main
を使用してください。
同じコードが1台の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!
エラーメッセージ(「メインクラスを見つけられないか、ロードできませんでした」)によると、問題には2つのカテゴリがあります。
メインクラスは、found完全修飾クラス名のタイプミスまたは間違った構文またはそれ提供されたクラスパスに存在しないの場合、できませんでした。
メインクラスをロードクラスを開始できないにできませんでした。通常、メインクラスは別のクラスを拡張し、そのクラスは提供されたクラスパスに存在しません。
例えば:
public class YourMain extends org.Apache.camel.spring.Main
キャメルスプリングが含まれていない場合、このエラーが報告されます。
問題の原因となっているものがメインクラスと関係がない場合があるので、これを難しい方法で見つけなければなりませんでした。私が引っ越したのは、参照されているライブラリでした。
メインクラスxxx Linuxが見つからないか、読み込めませんでした
私はちょうどその参照を削除し、それを再び追加しました、そしてそれは再びうまく働きました。
私はこの場合そのようなエラーがありました:
Java -cp lib.jar com.mypackage.Main
Windowsでは;
、Unixでは:
で動作します。
Java -cp lib.jar; com.mypackage.Main
-Xdiag を試してください。
Steve Cの答え は可能性のあるケースをうまくカバーしていますが、クラスがfoundまたはloadedにならないかどうかを判断するのはそれほど簡単ではないかもしれません。 (JDK 7以降)Java -Xdiag
を使用してください。これは、メッセージCould not find or load main class
messageが何を意味するのかについてのヒントを提供するNice stacktraceを出力します。
たとえば、メインクラスによって使用されていて、見つからなかったためにメインクラスがロードされなかった他のクラスを指すことがあります。
このコマンドを使います。
Java -cp . [PACKAGE.]CLASSNAME
例:クラス名がHello.Javaから作成されたHello.classの場合は、次のコマンドを使用します。
Java -cp . Hello
あなたのファイルHello.Javaがパッケージcom.demoの中にあるなら、下記のコマンドを使ってください。
Java -cp . com.demo.Hello
JDK 8では、クラスファイルが同じフォルダに存在することが何度もありますが、Java
コマンドはクラスパスを期待しているため、-cp .
を追加して現在のフォルダをクラスパスの参照として使用します。
この例では:
メインクラス を見つけられなかったか、ロードできませんでしたか?classpath
それはあなたが "-classpath"を使っているからですが、ダッシュはコマンドプロンプトのJava
で使われているのと同じダッシュではありません。この問題は、 メモ帳 からcmdへのコピー&ペーストで発生しました。
私の場合は、クラス名の代わりにソースファイル名を指定したのでエラーが発生しました。
Mainメソッドを含むクラス名をインタプリタに提供する必要があります。
私はこの問題を解決するためにかなりの時間を費やしました。私はどういうわけか私が私のクラスパスを間違って設定していると思ったが、問題は私がタイプしたということでした:
Java -cp C:/Java/MyClasses C:/Java/MyClasses/utilities/myapp/Cool
の代わりに:
Java -cp C:/Java/MyClasses utilities/myapp/Cool
完全修飾の意味は、フルパッケージ名の代わりにフルパス名を含めることを意味すると思いました。
あなたのケースが特に私のようなものであるなら、これはあなたを助けるかもしれません:初心者として私がJavaプログラムを実行しようとしたとき私もこの問題に遭遇しました。
私はこのようにコンパイルしました:
javac HelloWorld.Java
そして私も同じ拡張子で実行しようとしました:
Java Helloworld.Java
.Java
を削除してJava HelloWorld
のようなコマンドを書き直すと、プログラムは完全に実行されました。 :)
私の場合の問題を解決したのは、
実行したいプロジェクト/クラスを右クリックし、次にRun As
-> Run Configurations
をクリックします。次に、既存の設定を修正するか、次の方法で新しい設定を追加します。
Classpath
タブを開き、Advanced...
ボタンをクリックしてからプロジェクトのbin
フォルダ を追加します。
ここにあるすべての答えは、Windowsユーザーに向けられているようです。 Macの場合、クラスパスの区切り文字は:
ではなく;
です。 ;
を使用してクラスパスを設定する際のエラーとしてスローされないため、WindowsからMacに移行する場合、これを発見するのは困難です。
これが対応するMacコマンドです。
Java -classpath ".:./lib/*" com.test.MyClass
この例では、パッケージはcom.test
で、lib
フォルダもクラスパスに含まれています。
まずこのコマンドを使ってパスを設定します。
set path="paste the set path address"
その後、プログラムをロードする必要があります。保存したドライブに「cd(フォルダ名)」と入力してコンパイルします。たとえば、プログラムがDドライブに保存されている場合は、「D:」と入力してEnterキーを押し、「cd(folder name)」と入力します。
JARファイルの作成に Maven を使用する場合は、必ず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ウィンドウが開いている限り続くでしょう。
私は同じ問題を抱えていて、ついに私の間違いを見つけました:)私はコンパイルのためにこのコマンドを使いました、そして、それは正しく働いた。
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
)
これは具体的なケースですが、私はこのページで解決策を探していてそれが見つからなかったので、ここで追加します。
Windows(7でテスト済み)では、クラス名とパッケージ名に特殊文字(á
など)を使用できません。 Linuxもそうです。
私はNetBeansで.jar
を作成し、それをコマンドラインで実行しようとしたときにこれを発見しました。これはNetBeansで実行されましたが、コマンド行では実行されませんでした。
あなたは本当に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]);
}
}
}
それからsrcフォルダにcd
し、実行する必要があるコマンドは次のようになります。
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
時々、あなたが試したかもしれないいくつかのオンラインコンパイラでは、あなたがpublic class [Classname]
を書かないでただclass [Classname]
を書くならば、あなたはこのエラーを得るでしょう。
Windows PowerShellで宣伝されているようにJava
を-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接続のテスト中にも、同様のエラーが発生しました。将来的には誰でも直接2つのコマンドを調べることができ、さらに先に進むことができるように、私の最終的な解決策を簡単に要約するのが良いと思います。
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に起こります
私の場合は、Windows 7システムで大文字と小文字のパッケージ名が混在していたためにエラーが発生しました。パッケージ名をすべて小文字に変更することで問題は解決しました。このシナリオでは、.Javaファイルを.classファイルにコンパイルしてもエラーは発生しません。同じ(sub-sub-sub-)ディレクトリからは実行されません。
Javaでは、Java実行可能ファイルを使用してコマンドラインからJVMを実行し、public static void main(PSVM)を使用してクラスファイルからプログラムを起動しようとすると、次のエラーが発生する可能性があります。 JVMは正確で、クラスファイルはクラスパスに存在します。
Error: main class not found or loaded
これは、PSVMのあるクラスファイルを読み込めなかった場合に起こります。考えられる理由の1つは、クラスがインタフェースを実装しているか、クラスパス上にない別のクラスを拡張している可能性があることです。通常、クラスがクラスパス上にない場合、スローされたエラーはそのことを示します。しかし、使用中のクラスが拡張または実装されていると、Javaはクラス自体をロードできません。
参照: https://www.computingnotes.net/Java/error-main-class-not-found-or-loaded/
私はこの問題をここで述べた解決策で解決することができませんでした(述べられた答えは間違いなく私の概念をクリアしましたが)。私はこの問題に2回直面し、そのたびに(Eclipse IDEで)さまざまな解決策を試してみました。
main
メソッドを見つけました。それで、私はそれ以降のクラスからmain
メソッドを削除しました。変なものがありました。
エラー:メインクラスmypackage.Appが見つからないかロードできませんでした
プロジェクトのpom.xmlにpom(親)設定があり(私のプロジェクトのpom.xmlが親pom.xmlを指していた)、relativePathがオフ/間違っていたことがわかりました。
以下は私のプロジェクトのpom.xmlの一部です
<parent>
<groupId>myGroupId</groupId>
<artifactId>pom-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../badPathHere/pom.xml</relativePath>
</parent>
Pom relativePathを解決したら、エラーは消えました。
図に行きます。
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" />
場合によっては、追加されたJARファイルを削除し、適切なビルドヘルプを使用して再度追加することをお勧めします。私にとってそれは定期的な問題でした、そして私は同じアプローチに従いました:
デフォルトでは、Javaは現在の作業ディレクトリである.
をデフォルトのCLASSPATH
として使用します。これが意味するのは、プロンプトでコマンドを入力したときです。 Java MyClass
を入力すると、コマンドはJava -cp . MyClass
型を持つものとして解釈されます。 -cp
とMyClass
の間にそのドットが見えましたか? ( cp は長い classpath オプションの短縮形)
ほとんどの場合これで十分であり、CLASSPATH
にディレクトリを追加しようとするまではうまくいくようです。プログラマーがこれを行う必要がある場合、ほとんどの場合、彼らはset CLASSPATH=path\to\some\dir
のようなコマンドを実行するだけです。このコマンドは、値path\to\some\dir
を持つCLASSPATH
という新しい環境変数を作成するか、または以前にCLASSPATH
が設定されている場合はその値をpath\to\some\dir
に置き換えます。
これが完了すると、CLASSPATH
環境変数が手に入り、Javaはもはやデフォルトのクラスパス(.
)を使用しませんが、設定したものを使用します。翌日エディタを開き、保存したディレクトリにJavaプログラムcd
を書き込み、コンパイルし、コマンドJava MyClass
で実行しようとすると、Nice出力が表示されます。 メインクラスが見つからないかロードできませんでした... (コマンドが以前にうまく機能していて、現在この出力を得ている場合は、これが当てはまる可能性があります)。
Java MyClass
コマンドを実行すると、Javaは現在の作業ディレクトリではなく、MyClass
ディレクトリに設定されている1つまたは複数のディレクトリでCLASSPATH
という名前のクラスファイルを検索します。 。
あなたがする必要があるのは、.
を再びクラスパスに追加することです。これは、コマンドset CLASSPATH=%CLASSPATH%;.
(セミコロンの後のドットに注意してください)で実行できます。わかりやすい英語では、このコマンドは「最初はCLASSPATH
(%CLASSPATH%
)の値を選択し、それに.
を追加して(;.
)、その結果をCLASSPATH
に代入します」と言っています。
そして voila 、あなたはいつものようにあなたのコマンドJava MyClass
をもう一度使うことができます。