web-dev-qa-db-ja.com

エラー:メインクラスが見つからないかロードできませんでした

私は、シミュレーションモデリングパッケージであるVensim用の共有オブジェクトとJavaのインターフェースをとることを可能にすることを意図して、私のJavaコードのコンパイルと実行に問題があります。

次のコードはエラーなしでコンパイルされます。

javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java     VensimHelper.Java VensimException.Java VensimContextRepository.Java

しかし、私は以下を実行しようとすると:

Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars

「エラー:メインクラスのSpatialModelが見つからないかロードできませんでした」というエラーが表示されます。私のSpatialModel.Javaコードには 'main'メソッド(下記)が含まれているので、問題が何なのかわからない - 誰かが私を手伝ってくれる?ありがとう。

import Java.io.File;
import Java.text.NumberFormat;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;

import org.Apache.log4j.Logger;

public class SpatialModel {

    private VensimHelper vh;

    public static final String DLL_LIBNAME_PARAM = "vensim_lib_nam";

    public static final String MODEL_PATH_PARAM = "vensim_model_path";

    private final static int VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT = 10;

    public SpatialModel() throws SpatialException {

        String libName = System.getProperty(DLL_LIBNAME_PARAM);
        String modelPath = System.getProperty(MODEL_PATH_PARAM);        

        if(libName == null || libName.trim().equals("")) {
            log.error("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
            throw new SpatialException("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
        }

        if(modelPath == null || modelPath.trim().equals("")) {
            log.error("Model path has to set with -D" + MODEL_PATH_PARAM);
            throw new SpatialException("Model path ahs to be set with -D" + MODEL_PATH_PARAM);
        }

        for (int i = 0; i < VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT && vh == null; i++) {
            try {
                log.info("creating new vensim helper\n\tdll lib: " + libName + "\n\tmodel path: " + modelPath);
                vh = new VensimHelper(libName, modelPath);
            } catch (Throwable e) {
                log.error("An exception was thrown when initializing Vensim, try: " + i, e);
            }
        }
        if (vh == null) {
            throw new SpatialException("Can't initialize Vensim");
        }

    }

    public static void main(String[] args) throws VensimException {

        long before = System.currentTimeMillis();   
        String libName = System.getProperty(DLL_LIBNAME_PARAM);
        String modelPath = System.getProperty(MODEL_PATH_PARAM);

        if (libName == null) {
            libName = "libvensim";
        }
        if(modelPath == null) {
            modelPath = "~/BassModel.vmf";
        }

        System.setProperty(DLL_LIBNAME_PARAM, libName);
        System.setProperty(MODEL_PATH_PARAM, modelPath);

        if (args.length > 0 && args[0].equals("info")) {
            System.out.println(new VensimHelper(libName, modelPath).getVensimInfo());
        } else if (args.length > 0 && args[0].equals("vars")) {
            VensimHelper helper = new VensimHelper(libName, modelPath);
            String[] vars = helper.getVariables();
            for (String var : vars) {
                System.out.println(helper.getVariableInfo(var));
            }
        } else {

            File f = new File(".");
            System.out.println(f.getAbsolutePath());

            SpatialModel sm = new SpatialModel();
        }

        System.out.println("Execution time: " + (System.currentTimeMillis() - before));
    }

}
332
Dave

.classファイルの場所を必ずクラスパスに追加してください。そのため、現在のフォルダにある場合は、クラスパスに.を追加します。 windowsクラスパスの区切り文字はセミコロン、つまり;であることに注意してください。

257
Saket

エラーが発生したときにこれら2つを試すことができます:「メインクラスが見つからないかロードできませんでした」

クラスファイルがHelloWorldプログラム名d:\sampleで次のディレクトリに保存されている場合

  1. Java -cp d:\sample HelloWorld
  2. Java -cp . HelloWorld
58

現在のディレクトリをJavaクラスパスに追加する必要があると思います

Java -cp .:./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
36
Rafael Cordones

あなたのjavacとJavaコマンドにクラスパスを含める必要があります

javac -cp . PackageName/*.Java
java -cp . PackageName/ClassName_Having_main

次のものがあるとします。

パッケージ名:com.testクラス名:こんにちは(メインを持つ)ファイルは "src/com/test/Hello.Java"の中にあります

外部ディレクトリから:

$ cd src
$ javac -cp . com/test/*.Java
$ Java -cp . com/test/Hello
  • Windowsでも同じことがうまくいくでしょう、私はすでに試しました
30
msoliman

eclipseで作業している場合は、プロジェクトのクリーンアップ(project\clean..clean all projects)を作成するだけです。

25
cane

エラーが発生した場合は、クラスパスを設定する必要があります。

メインクラスXYZが見つからないかロードできませんでした

例えば:

E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.Java
E:\>Java XYZ
17
user2318595

実行しようとしていたため、このエラーが発生しました

javac HelloWorld.Java && Java HelloWorld.class

.classを削除したはずのとき:

javac HelloWorld.Java && Java HelloWorld
16
Lri

buildPathを確認してください。存在しないライブラリを参照している可能性があります。

9
Samsky

JDK 1.6が必要なJavaアプリケーションを実行しようとしていて、JDK 1.4で実行しようとしている場合は、このエラーに遭遇します。一般に、古いJRE上でJavaアプリケーションを実行しようとすると失敗する可能性があります。新しいJRE/JDKをインストールしてみてください

7
Shaddu

私はこの質問がlinuxでタグ付けされていたことを知っていますが、 windows では、;ではなく:でcp引数を区切る必要があるかもしれません。

Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar;./vensim.jar SpatialModel vars

http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

7
Snekse

このエラーが発生し、 Mavenを使用してJarsを構築している の場合、Javaクラスがsrc/main/Java/に含まれていない可能性があります。

私の場合は、Eclipseでプロジェクトを作成しました。デフォルトでは(src/main/Java/ではなく)srcです。

それで私はmypackage.morepackage.myclassのようなものとsrc/mypackage/morepackage/myclassのように見えるディレクトリ構造になった、それは本質的に何の問題もありません。しかしmvn clean installを実行すると、src/main/Java/mypackage/morepackage/myclassを探します。クラスは見つかりませんが、エラーにはなりません。それでそれはうまく構築され、あなたがあなたの出力されたJarを実行するときあなたは結果が次のようになるでしょう:

Error: Could not find or load main class mypackage.morepackage.myclass

パッケージ化されたJarにクラスが含まれていないからです。

6
Mike S

Java -verbose:class HelloWorldは、どのクラスがロードされているのかを理解するのに役立ちます。

また、前述のように、完全修飾名(つまり、パッケージを含める)を呼び出すことを忘れないでください。

5
Jose Alban

[プロジェクト]> [クリーン]をクリックし、[ビルドパス]> [ライブラリ]に正しいライブラリがあることを確認します。

5
Giri

問題はあなたの主な機能に関するものではありません。チェックアウト

javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java     VensimHelper.Java VensimException.Java VensimContextRepository.Java

出力して実行します。

5
ymutlu

あなたがEclipseを使っているなら...私は私のメインクラスファイルの名前を変更し、そのエラーを得ました。 "Run As"コンフィギュレータに行き、そのプロジェクトのクラスパスの下に、両方のファイルをクラスパスにリストしていました。私は名前を変更した古いクラスを削除し、新しい名前を持つクラスをそのままにしてコンパイルして問題なく実行しました。

4
Argyle Ghost

多くの人が考えるよりも単純な場合、私は含まれています:)

Project Folder/src/packageに移動するとyourClass.Javaが表示されます。次にjavac yourClass.Javaを実行してyourClass.classを作成し、srcフォルダからbuildに移動します。そこにあなたが走らせることができるフォルダJava package.youClass

私はMac上でターミナルを使用しているか、またはWindows上でコマンドプロンプトを使用して同じタスクを実行できます。

4
don

この問題は、既存のプロジェクトをEclipseにインポートしたときに発生しました。何が起こるかというと、パッケージの中ではなく、パッケージの外にあるすべてのファイルがコピーされます。したがって、run> run configurationを実行しようとしたときに、mainメソッドがパッケージに含まれていなかったため、見つけることができませんでした。私がしたのはファイルをパッケージにコピーすることだけで、Eclipseはそれからmainメソッドを検出できました。ですから、最終的には、あなたのJavaファイルが正しいパッケージに入っていることを確認することによって、Eclipseがあなたのメインメソッドを見つけることができることを確認してください。

4
JohnMerlino

私はJava 1.8を使用していました、そして私がNetBeansで "Build and clean"を押して、もう一度1.7に切り替え、Okをクリックし、プロパティを再度開いて1.8に戻したところ、このエラーは突然起こりました。

私は私がこれを手伝ってくれることを願っています、これらのエラーはかなり時間がかかることがあります。

4
Maxim Geerinck

私はWindowsで同様の問題を抱えています、それはクラスパスに関連しています。コマンドラインから、Javaファイルが置かれているディレクトリ(* .Javaおよび* .class)までナビゲートしてから、コマンドを再試行してください。

1
edwindh

Anypoint Studio(EclipseベースのIDE)を使用しています。私の場合、Javaコードの実行中にまったく異なることが実行されることが判明するまで、すべてがうまく機能しました。それから私は.classファイルを削除しました。この時点で、私はこの質問の題名からエラーメッセージを受け取りました。プロジェクトを掃除しても問題は解決しませんでした。

IDEを再起動した後、すべてうまくいった。

1
Zsolti

これで今日の問題は解決しました。

cd /path/to/project
cd build
rm -r classes

それからそれをきれいにして構築し、あなたが必要とする個々のファイルを実行します。

1
Luc