it-swarm.cn

错误:找不到或加载主类

我在编译和运行我的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));
    }

}
332
Dave

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

257
Saket

如果班级在一个包中

package thepackagename;

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

然后打电话:

Java -classpath . TheClassName

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

Java -classpath . thepackagename.TheClassName

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

要清楚,这个类的名称不是TheClassName,它是thepackagename.TheClassName。尝试执行TheClassName不起作用,因为 不存在具有该名称的类 。不管怎样,不在当前的类路径上。

最后,请注意执行编译的( .class)版本,而不是源代码( 。Java)版本。因此“CLASSPATH”。

127
aliteralmind

当你收到错误时可以尝试这两个:'找不到或加载主类'

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

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

我相信您需要将当前目录添加到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类名:Hello(有main)文件位于“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 appliation可能会失败。尝试安装新的JRE/JDK

7
Shaddu

我知道这个问题是用linux标记的,但是在 windows 上,你可能需要将你的cp args与;而不是:分开。

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 ,那么您很可能在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中。

6
Mike S

Java -verbose:class HelloWorld可能有助于您了解正在加载哪些类。

另外,如前所述,请记住调用完整的限定名称(即包括包)。

5
Jose Alban

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

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 ...我重命名了我的主类文件并得到了该错误。我去了“运行方式”配置程序,在该项目的类路径下,它已在类路径中列出了这两个文件。我删除了我重命名的旧类,并离开了具有新名称的类,并且编译并运行得很好。

4
Argyle Ghost

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

cd到Project Folder/src/package你应该看到yourClass.Java然后运行javac yourClass.Java这将创建yourClass.class然后cd出src文件夹并进入build文件夹你可以运行Java package.youClass

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

4
don

当我将现有项目导入Eclipse时,我遇到了这个问题。会发生什么情况,它会复制不在包中但在包外的所有文件。因此,当我尝试运行>运行配置时,它找不到main方法,因为它不在包中。我所做的只是将文件复制到包中,然后Eclipse能够检测到主要方法。因此,最终确保Eclipse可以找到您的主要方法,确保您的Java文件位于正确的包中。

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