错误。无法找到或加载主类

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

}
解决办法

你必须确保你把.class文件的位置添加到你的classpath。因此,如果它在当前文件夹中,请将.添加到你的classpath中。 注意,Windows的classpath分隔符是一个分号,也就是;

评论(7)

如果该类是在一个包中

package thepackagename;

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

然后打电话。

java -classpath . TheClassName

结果是 "Error: 无法找到或加载主类TheClassName"。 这是因为它必须用完全限定的名称来调用。

java -classpath . thepackagename.TheClassName

而这个thepackagename目录必须存在于classpath中。 在这个例子中,.,指的是当前目录,是整个classpath的内容。 因此,这个特殊的例子必须从thepackagename存在的目录中调用。

要说明的是,这个类的名字不是TheClassName,而是thepackagename.TheClassName。 试图执行 "TheClassName "是行不通的,因为没有这个名字的类存在。 反正在当前的classpath上是不存在的。

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

评论(4)

当你出现错误时,你可以试试这两个。 'could not find or load main class'

如果你的类文件保存在以下目录中,并使用 "HelloWorld "程序名称。 "d:sample

  1. java -cp d:\sample HelloWorld
  2. java -cp .HelloWorld
评论(3)

我相信你需要把当前目录添加到Java的classpath中去

java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
评论(5)

你必须在你的javac和java命令中加入classpath。

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

假设你有以下内容

包命名为。 com.test 班级名称 你好(有主) 文件位于"src/com/test/Hello.java&quot里面。

从外部目录。

$ cd src
$ javac -cp . com/test/*.java
$ java -cp . com/test/Hello
  • 在windows下也会有同样的效果,我已经试过了
评论(0)

如果你在Eclipse中工作,只要对项目进行清理(project\clean...``clean所有项目)即可。

评论(0)

如果出现错误,你必须设置classpath。

无法找到或加载主类XYZ

例如:

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

我之所以出现这个错误,是因为我在尝试运行

javac HelloWorld.java && java HelloWorld.class

而我应该删除.class

javac HelloWorld.java && java HelloWorld
评论(2)

检查你的 "BuildPath",可能是你引用的库已经不存在了。

评论(0)

如果你收到这个错误,并且你是使用Maven来构建你的Jars,那么很有可能你的Java类没有放在src/main/java/中。

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

所以我最终得到了一个类似于mypackage.morepackage.myclass的东西,目录结构看起来像src/mypackage/morepackage/myclass,这本身没有什么问题。 但是当你运行mvn clean install时,它会寻找src/main/java/mypackage/morepackage/myclass。 它不会找到这个类,但也不会出错。 所以它会成功地构建,当你运行输出的 Jar 时,结果是:{{10272563}。

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

因为它根本就没有把你的类包含在打包的Jar中。

评论(2)

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

评论(0)

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

评论(0)

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

评论(0)

java -verbose:class HelloWorld可能会帮助你了解哪些类正在被加载。

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

评论(0)

问题不在于你的主要功能。请注意

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

输出并运行它。

评论(0)

我使用的是Java 1.8,当我在NetBeans中按下"Build and clean&quot时,突然出现了这个错误。 在NetBeans中。 我又短暂地切换到1.7,点击确定,重新打开属性,再切换回1.8,一切都完美地运行了。

希望能帮助别人解决这个问题,因为这些错误是相当耗时的。

评论(0)

当我把一个现有的项目导入到eclipse时,出现了这个问题。 它把所有的文件都复制到了包里,而不是包里,而是包外。 因此,当我尝试运行> run configurations时,它找不到主方法,因为它不在包里。 我所做的只是将文件复制到包中,然后Eclipse就能检测到主方法。 所以最终要确保Eclipse能找到你的主方法,要确保你的java文件在正确的包里。

评论(0)

如果这么简单,比很多人想象的还要简单,包括我在内:)

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

我在Mac上使用终端,或者你可以在windows上使用命令提示符完成同样的任务。

评论(0)

如果你使用的是Eclipse... 我重命名了我的主类文件并得到了这个错误。 我去了"Run As&quot.配置器,在该工程的类路径下,它把两个文件都列在了类路径中。 配置器,在那个项目的类路径下,它在类路径中列出了两个文件。 我删除了我重命名的旧类,留下了有新名字的类,然后它编译并运行得很好。

评论(0)

今天我就解决了这个问题。

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

然后清理&构建它并运行你需要的各个文件。

评论(0)