web-dev-qa-db-ja.com

「メインクラスが見つけないからロードできない」とはどういう意味ですか?

新しいJava開発者が経験する一般的な問題は、彼らのプログラムがエラーメッセージで実行に失敗するということです:Could not find or load main class ...

これはどういう意味ですか、原因は何ですか、またどのように修正すればよいですか?

1137
Stephen C

ソースコード名がHelloWorld.Javaの場合、コンパイル済みコードはHelloWorld.classになります。

あなたがそれを使用してそれを呼び出すと、あなたはそのエラーになります:

Java HelloWorld.class

代わりに、これを使ってください。

Java HelloWorld
208
panoet

クラスがパッケージ内にある場合は、メインディレクトリにcdして、クラスのフルネーム(packageName.MainClassName)を使用して実行する必要があります。

例:

私のクラスはここにあります:

D:\project\com\cse\

私のメインクラスのフルネームは次のとおりです。

com.cse.Main

cdをメインディレクトリに戻します。

D:\project

それからJavaコマンドを発行します。

Java com.cse.Main
115

メインクラスとメインメソッドを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を使用してください。

49
M-Razavi

同じコードが1台のPCで機能するが、それが別のPCでエラーを示すとき、私が今まで見つけた最もよい解決策は次のようにコンパイルすることです:

javac HelloWorld.Java
java -cp . HelloWorld
38
Enamul Hassan

たとえば、次のようにコマンドラインでクラスパスを指定するのに役立ちました。

  1. 新しいフォルダC:\tempを作成します

  2. C:\tempにTemp.Javaファイルを作成し、その中に次のクラスを追加します。

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
    
  3. フォルダーC:\tempでコマンドラインを開き、次のコマンドを書いてTempクラスをコンパイルします。

    javac Temp.Java
    
  4. コンパイルされたJavaクラスを実行し、-classpathオプションを追加してJREにクラスの場所を知らせます。

    Java -classpath C:\temp Temp Hello!
    
31
Celebes

エラーメッセージ(「メインクラスを見つけられないか、ロードできませんでした」)によると、問題には2つのカテゴリがあります。

  1. メインクラスをfoundにできませんでした
  2. メインクラスをloadedにすることはできませんでした(このケースは、受け入れられた回答で完全には説明されていません)

メインクラスは、found完全修飾クラス名のタイプミスまたは間違った構文またはそれ提供されたクラスパスに存在しないの場合、できませんでした。

メインクラスをロードクラスを開始できないにできませんでした。通常、メインクラスは別のクラスを拡張し、そのクラスは提供されたクラスパスに存在しません。

例えば:

public class YourMain extends org.Apache.camel.spring.Main

キャメルスプリングが含まれていない場合、このエラーが報告されます。

問題の原因となっているものがメインクラスと関係がない場合があるので、これを難しい方法で見つけなければなりませんでした。私が引っ越したのは、参照されているライブラリでした。

メインクラスxxx Linuxが見つからないか、読み込めませんでした

私はちょうどその参照を削除し、それを再び追加しました、そしてそれは再びうまく働きました。

14
Eduardo Dennis

私はこの場合そのようなエラーがありました:

Java -cp lib.jar com.mypackage.Main

Windowsでは;、Unixでは:で動作します。

Java -cp lib.jar; com.mypackage.Main
13
Yamahar1sp

-Xdiag を試してください。

Steve Cの答え は可能性のあるケースをうまくカバーしていますが、クラスがfoundまたはloadedにならないかどうかを判断するのはそれほど簡単ではないかもしれません。 (JDK 7以降)Java -Xdiagを使用してください。これは、メッセージCould not find or load main class messageが何を意味するのかについてのヒントを提供するNice stacktraceを出力します。

たとえば、メインクラスによって使用されていて、見つからなかったためにメインクラスがロードされなかった他のクラスを指すことがあります。

12
jan.supol

このコマンドを使います。

Java -cp . [PACKAGE.]CLASSNAME

例:クラス名がHello.Javaから作成されたHello.classの場合は、次のコマンドを使用します。

Java -cp . Hello

あなたのファイルHello.Javaがパッケージcom.demoの中にあるなら、下記のコマンドを使ってください。

Java -cp . com.demo.Hello

JDK 8では、クラスファイルが同じフォルダに存在することが何度もありますが、Javaコマンドはクラスパスを期待しているため、-cp .を追加して現在のフォルダをクラスパスの参照として使用します。

12
shaILU

この例では:

メインクラス を見つけられなかったか、ロードできませんでしたか?classpath

それはあなたが "-classpath"を使っているからですが、ダッシュはコマンドプロンプトのJavaで使われているのと同じダッシュではありません。この問題は、 メモ帳 からcmdへのコピー&ペーストで発生しました。

9
Nathan Williams

私の場合は、クラス名の代わりにソースファイル名を指定したのでエラーが発生しました。

Mainメソッドを含むクラス名をインタプリタに提供する必要があります。

7
KawaiKx

私はこの問題を解決するためにかなりの時間を費やしました。私はどういうわけか私が私のクラスパスを間違って設定していると思ったが、問題は私がタイプしたということでした:

Java -cp C:/Java/MyClasses C:/Java/MyClasses/utilities/myapp/Cool  

の代わりに:

Java -cp C:/Java/MyClasses utilities/myapp/Cool   

完全修飾の意味は、フルパッケージ名の代わりにフルパス名を含めることを意味すると思いました。

6
mathewbruens

enter image description here

クラスファイルの場所: C:\ test\com\company

ファイル名: Main.class

完全修飾クラス名: com.company.Main

コマンドラインコマンド:

Java  -classpath "C:\test" com.company.Main

ここで、クラスパスに\ com\companyは含まれていません。

6
developer747

あなたのケースが特に私のようなものであるなら、これはあなたを助けるかもしれません:初心者として私がJavaプログラムを実行しようとしたとき私もこの問題に遭遇しました。

私はこのようにコンパイルしました:

javac HelloWorld.Java

そして私も同じ拡張子で実行しようとしました:

Java Helloworld.Java

.Javaを削除してJava HelloWorldのようなコマンドを書き直すと、プログラムは完全に実行されました。 :)

5
Ramesh Pareek

私の場合の問題を解決したのは、

実行したいプロジェクト/クラスを右クリックし、次にRun As-> Run Configurationsをクリックします。次に、既存の設定を修正するか、次の方法で新しい設定を追加します。

Classpathタブを開き、Advanced...ボタンをクリックしてからプロジェクトのbinフォルダ を追加します。

5
syntagma

ここにあるすべての答えは、Windowsユーザーに向けられているようです。 Macの場合、クラスパスの区切り文字は:ではなく;です。 ;を使用してクラスパスを設定する際のエラーとしてスローされないため、WindowsからMacに移行する場合、これを発見するのは困難です。

これが対応するMacコマンドです。

Java -classpath ".:./lib/*" com.test.MyClass

この例では、パッケージはcom.testで、libフォルダもクラスパスに含まれています。

5
blue-sky

まずこのコマンドを使ってパスを設定します。

set path="paste the set path address"

その後、プログラムをロードする必要があります。保存したドライブに「cd(フォルダ名)」と入力してコンパイルします。たとえば、プログラムがDドライブに保存されている場合は、「D:」と入力してEnterキーを押し、「cd(folder name)」と入力します。

5
arun

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>
5
Junchen Liu

Windowsでは、最初にCLASSPATH値に.;を付けます。

です。 (ドット)は「現在のディレクトリを探す」という意味です。これは恒久的な解決策です。

また、set CLASSPATH=%CLASSPATH%;.を使って「一度だけ」設定することもできます。これはあなたのcmdウィンドウが開いている限り続くでしょう。

4
Nenad Bulatovic

私は同じ問題を抱えていて、ついに私の間違いを見つけました:)私はコンパイルのためにこのコマンドを使いました、そして、それは正しく働いた。

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

4
Omid Mohebbi

これは具体的なケースですが、私はこのページで解決策を探していてそれが見つからなかったので、ここで追加します。

Windows(7でテスト済み)では、クラス名とパッケージ名に特殊文字(áなど)を使用できません。 Linuxもそうです。

私はNetBeansで.jarを作成し、それをコマンドラインで実行しようとしたときにこれを発見しました。これはNetBeansで実行されましたが、コマンド行では実行されませんでした。

4
GuiRitter

あなたは本当に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
3
mdarmanin

時々、あなたが試したかもしれないいくつかのオンラインコンパイラでは、あなたがpublic class [Classname]を書かないでただclass [Classname]を書くならば、あなたはこのエラーを得るでしょう。

3
lor

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はクラスパス引数を正しく処理できます。

3
Chezzwizz

Java MongoDB JDBC接続のテスト中にも、同様のエラーが発生しました。将来的には誰でも直接2つのコマンドを調べることができ、さらに先に進むことができるように、私の最終的な解決策を簡単に要約するのが良いと思います。

Javaファイルと外部依存関係(JARファイル)が存在するディレクトリにいるとします。

コンパイル:

javac -cp mongo-Java-driver-3.4.1.jar JavaMongoDBConnection.Java
  • -cp - クラスパス引数。すべての依存JARファイルを一つずつ渡す
  • * .Java - これはmainメソッドを持つJavaクラスファイルです。 sdsd

実行:

Java -cp mongo-Java-driver-3.4.1.jar: JavaMongoDBConnection
  • すべての依存関係JARファイルが終了した後にコロン(Unix)/コンマ(Windows)を観察してください。
  • 最後に、拡張子を付けずにメインクラス名を確認します(.classや.Javaは使用しません)。
3
khichar.anil

大丈夫、すでに多くの答えがありますが、ファイルの許可が原因である可能性があるというケースについては誰も言及していません。実行中のユーザーが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に起こります

3
biocyberman

私の場合は、Windows 7システムで大文字と小文字のパッケージ名が混在していたためにエラーが発生しました。パッケージ名をすべて小文字に変更することで問題は解決しました。このシナリオでは、.Javaファイルを.classファイルにコンパイルしてもエラーは発生しません。同じ(sub-sub-sub-)ディレクトリからは実行されません。

2
Howard007

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
Anandaraja Ravi

私はこの問題をここで述べた解決策で解決することができませんでした(述べられた答えは間違いなく私の概念をクリアしましたが)。私はこの問題に2回直面し、そのたびに(Eclipse IDEで)さまざまな解決策を試してみました。

  • 最初に、私は自分のプロジェクトの異なるクラスで複数のmainメソッドを見つけました。それで、私はそれ以降のクラスからmainメソッドを削除しました。
  • 第二に、私は次の解決策を試してみました:
    1. メインのプロジェクトディレクトリを右クリックします。
    2. ソースに向かい、その後、クリーンアップしてデフォルト設定をそのまま使用し、[完了]をクリックします。いくつかのバックグラウンドタスクの後、あなたはあなたのメインプロジェクトディレクトリに導かれるでしょう。
    3. その後、私は自分のプロジェクトを閉じ、再度開き、そしてブームになり、ついに自分の問題を解決しました。
2
Anus Kaleem

変なものがありました。

エラー:メインクラス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を解決したら、エラーは消えました。

図に行きます。

2
granadaCoder

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" />
2
Jaanus

場合によっては、追加されたJARファイルを削除し、適切なビルドヘルプを使用して再度追加することをお勧めします。私にとってそれは定期的な問題でした、そして私は同じアプローチに従いました:

  1. 参照されたすべてのJARファイルをjarAddOnsフォルダに入れ、安全な場所にコピーします。
  2. Eclipseから(またはIDEから)JARファイルを削除します。
  3. プロジェクトフォルダ全体をワークスペースから安全な場所に移動する
  4. Eclipse(IDE)を再起動してください。
  5. 安全な場所からプロジェクトディレクトリをインポートしましょう。
  6. JarAddOnsフォルダー(以前は安全な場所に保存されていました)からJARファイルをプロジェクトに追加します。
  7. プロジェクトビルドパス、JARファイルの追加、および適用
  8. 今すぐプロジェクトを実行します。エラーは表示されません。

この問題がEclipseに関連している場合

クラスパスにプロジェクトを追加してみてください。

下の画像を参照してください。

enter image description here

この方法は私にとって役に立ちました。

1
Tunde Pizzle

IDE開発(Eclipse、NetBeansなど)のコンテキストでは、メインクラスがあるときに自分のIDEが実行される場所がわかるように、プロジェクトプロパティを設定してメインクラスを作成する必要があります。 "Play"を押してください。

  1. プロジェクトを右クリックしてから、プロパティ
  2. Runカテゴリに移動して、メインクラスを選択してください
  3. ヒット Run ボタン。

Enter image description here

1
cepix

これは私にも起こりました。私の場合、ソースコードにHttpServletクラスが存在する場合にのみ発生しました(Idea Intellijがコンパイル時エラーを出さず、サーブレットパッケージは正常にインポートされましたが、実行時にこのmain classエラー)。

なんとか解決できました。私はファイル-プロジェクト構造に行きました:

enter image description here

次にモジュールに:

enter image description here

サーブレットモジュールの近くに提供スコープがありました。コンパイルに変更しました:

enter image description here

そしてうまくいきました!

0
parsecer

デフォルトでは、Javaは現在の作業ディレクトリである.をデフォルトのCLASSPATHとして使用します。これが意味するのは、プロンプトでコマンドを入力したときです。 Java MyClassを入力すると、コマンドはJava -cp . MyClass型を持つものとして解釈されます。 -cpMyClassの間にそのドットが見えましたか? ( 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をもう一度使うことができます。

0
Robert Odoch