the - java error: could not find or load main class




錯誤:無法找到或加載主類 (15)

這個問題在這裡已經有了答案:

我無法編譯和運行我的Java代碼,目的是為了讓我能夠將Java與Vensim(一個仿真建模軟件包)的共享對象連接起來。

下面的代碼編譯沒有錯誤:

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));
    }

}

java -verbose:class HelloWorld可以幫助你理解哪些類正在被加載。

另外,如前所述,請記住調用完整限定名稱(即包含包)。


問題不在於你的主要功能。 退房

javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java     VensimHelper.java VensimException.java VensimContextRepository.java

輸出並運行它。


如果你遇到這個錯誤,並且你正在使用Maven來構建你的Jars ,那麼很可能你在src/main/java/沒有你的Java類。

在我的情況下,我在Eclipse中創建了我的項目,默認為src (而不是src/main/java/

所以我最終得到了像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中。


如果出現錯誤,您必須設置類路徑:

無法找到或加載主類XYZ

例如:

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

如果您嘗試運行需要JDK 1.6的Java應用程序,並且您試圖在JDK 1.4上運行,那麼您將遇到此錯誤。 通常,嘗試在舊的JRE上運行Java應用程序可能會失敗。 嘗試安裝新的JRE / JDK


如果比許多人想像的那麼簡單,我包括:)

cd到Project Folder/src/package那裡你應該看到你的Class.java然後運行javac yourClass.java它將創建你的Class.class然後cd出src文件夾並進入build文件夾那裡你可以運行java package.youClass

我在Mac上使用終端,或者您可以使用Windows上的命令提示符完成相同的任務


您必須將classpath包含到您的javac和java命令中

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

假設你有以下幾點

包名:com.test類名:Hello(擁有主)文件位於“src / com / test / Hello.java”

從外部目錄:

$ cd src
$ javac -cp . com/test/*.java
$ java -cp . com/test/Hello
  • 在Windows中,同樣的事情也會起作用,我已經嘗試過了

您必須確保將.class文件的位置添加到類路徑中。 所以,如果它在當前文件夾中,然後添加. 到你的類路徑。 請注意,Windows類路徑分隔符是一個分號,即;


我使用的是Java 1.8,當我在netbeans中按下“Build and clean”時突然出現這個錯誤,我再次轉換為1.7,點擊OK,重新打開屬性並切換回1.8,所有工作都完美無缺。

我希望我能幫助別人解決這個問題,這些錯誤可能會非常耗時。


我在Windows中有類似的問題,它與類路徑有關。 從命令行導航到Java文件(* .java和* .class)所在的目錄,然後再次嘗試使用命令。


我相信你需要將當前目錄添加到Java類路徑中

java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars


當您收到錯誤信息時,您可以嘗試以下兩種方法:'無法找到或加載主類'

如果您的類文件使用HelloWorld程序名稱d:\sample保存在以下目錄中

  1. java -cp d:\sample HelloWorld
  2. java -cp . HelloWorld

當我將一個現有的項目導入eclipse時,發生了這個問題。 它會復制所有不在包中的文件,而是複制包中的所有文件。 因此,當我嘗試運行>運行配置時,找不到主要方法,因為它不在包中。 我所做的只是將文件複製到軟件包中,然後Eclipse能夠檢測到主要方法。 所以最終確保Eclipse能夠找到你的主要方法,確保你的java文件在正確的包中。


項目>清理,然後確保BuildPath>庫具有正確的庫。





linux