关于Java:错误:找不到或加载主类Could not find or load main class

Error: Could not find or load main class

本问题已经有最佳答案,请猛点这里访问。

我在编译和运行Java代码时遇到了麻烦,这是为了允许我用Java与一个共享对象进行接口,它是VimSM,一个仿真建模包。

以下代码编译时不会出错:

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

但是,当我尝试运行以下命令时:

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

我得到以下错误:"错误:无法找到或加载主类空间模型"。我的spacemodel.java代码确实包含一个"main"方法(如下),所以我不确定问题是什么-有人能帮我吗?谢谢。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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
\tdll lib:"
+ libName +"
\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));
    }

}


必须确保将.class文件的位置添加到类路径中。因此,如果它在当前文件夹中,那么将.添加到类路径中。注意,windows类路径分隔符是一个分号,即;


如果类在包中

1
2
3
4
5
6
7
package thepackagename;

public class TheClassName {
  public static final void main(String[] cmd_lineParams)  {
     System.out.println("Hello World!");
  }
}

然后打电话:

1
java -classpath . TheClassName

结果出现Error: Could not find or load main class TheClassName。这是因为必须使用其完全限定名调用它:

1
java -classpath . thepackagename.TheClassName

而且这个thepackagename目录必须存在于类路径中。在本例中,表示当前目录的.是类路径的整体。因此,必须从thepackagename所在的目录中调用这个特定的示例。

很明显,这个类的名字不是TheClassName,而是thepackagename.TheClassName。尝试执行TheClassName不起作用,因为不存在具有该名称的类。但不在当前类路径上。

最后,注意编译的(.class)版本是执行的,而不是源代码(.java)版本。因此是"类路径"。


当出现以下错误时,可以尝试这两种方法:"找不到或加载主类"

如果类文件用HelloWorld程序名保存在以下目录中d:\sample

  • java -cp d:\sample HelloWorld
  • java -cp . HelloWorld

  • 我相信您需要将当前目录添加到Java类路径中。

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


    必须将类路径包含到JavaC和Java命令中。

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

    假设你有以下几点

    名为:com.test的包班级名称:你好(有主班)文件位于"SRC/COM/Test/Hello,Java"的内部。

    从外部目录:

    1
    2
    3
    $ cd src
    $ javac -cp . com/test/*.java
    $ java -cp . com/test/Hello
    • 在Windows中,同样的东西也会起作用,我已经尝试过了


    如果您在Eclipse中工作,只需对项目进行清理(project\clean..clean all projects


    如果出现错误,则必须设置类路径:

    Could not find or load main class XYZ

    例如:

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

    我犯这个错误是因为我想跑

    1
    javac HelloWorld.java && java HelloWorld.class

    当我本应移除.class时:

    1
    javac HelloWorld.java && java HelloWorld


    检查您的buildPath,可能是您正在引用一个不再存在的库。


    如果您试图运行一个需要JDK 1.6的Java应用程序,而您正试图在JDK 1.4上运行,那么您将遇到这个错误。一般来说,试图在旧JRE上运行Java应用程序可能失败。尝试安装新的JRE/JDK


    我知道这个问题是用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


    如果你得到这个错误,并且你使用Maven来构建你的JAR,那么你就很可能在EDCOX1 13中没有Java类。

    在我的例子中,我在Eclipse中创建了我的项目,它默认为src,而不是src/main/java/

    因此,我最终得到了类似于mypackage.morepackage.myclass和类似于src/mypackage/morepackage/myclass的目录结构,它们本质上没有任何错误。但当你运行mvn clean install时,它会寻找src/main/java/mypackage/morepackage/myclass。它找不到类,但也不会出错。所以它将成功构建,当您运行输出的JAR时,结果是:

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

    因为它根本没有将类包含在打包的jar中。


    项目>清理,然后确保BuildPath>库具有正确的库。


    java -verbose:class HelloWorld可以帮助您了解正在加载的类。

    另外,如前所述,记住调用完整的限定名(即include package)。


    问题不在于你的主要功能。退房

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

    输出并运行它。


    我正在使用Java 1.8,当我在NETBeBes中按下"构建和清理"时,这个错误突然发生了,我再次切换了1.7分钟,点击OK,重新打开的属性并切换回1.8,一切都运行得很好。

    我希望我能帮助别人解决这个问题,这些错误可能会非常耗时。


    当我将一个现有的项目导入Eclipse时,出现了这个问题。结果是它复制了不在包中但在包外部的所有文件。因此,当我尝试运行>运行配置时,它找不到主方法,因为它不在包中。我所做的只是将文件复制到包中,然后Eclipse能够检测到主要方法。因此,最终确保伊柯丽斯可以找到你的主要方法,确保你的Java文件在正确的包中。


    如果比许多人想象的那么简单,我也包括在内:)

    cd到Project Folder/src/package在那里,你应该看到yourclass.java,然后运行javac yourClass.java创建你的rclass.class,然后从src文件夹中运行cd到build文件夹中运行java package.youClass

    我在Mac上使用终端,或者您可以使用Windows上的命令提示来完成相同的任务。


    如果你使用Eclipse…我重命名了我的主类文件并得到了那个错误。我进入了"运行方式"配置程序,在该项目的类路径下,它在类路径中列出了这两个文件。我删除了重新命名的旧类,留下了具有新名称的类,它编译后运行得很好。


    我在Windows中也有类似的问题,它与类路径有关。从命令行导航到它所在的Java文件(*.java和*.class)所在的目录,然后用您的命令再试一次。


    我使用AnyPointStudio(基于Eclipse的IDE)。在我的例子中,所有的工作都很好,直到我发现在运行Java代码时,执行了完全不同的操作。然后我删除了.class文件。在这之后,我从这个问题的标题中得到了错误消息。清理项目并没有解决问题。

    重新启动IDE之后,一切都再次正常工作。


    这解决了我今天的问题:

    1
    2
    3
    cd /path/to/project
    cd build
    rm -r classes

    然后清除并生成它并运行所需的各个文件。