我在编译和运行我的Java代码时遇到了麻烦,旨在允许我将Java与Vensim的共享对象进行接口,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类路径中

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

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


问题不在于你的主要职能。检查

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

输出并运行它。


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


你可以尝试这两个当你得到错误:'无法找到或加载主类'

如果你的类文件保存在HelloWorld程序名下面的目录中 d: \样本

java -cp d:\sample HelloWorld Java -cp。HelloWorld


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


我知道这个问题被标记为linux,但在windows上,你可能需要用一个;而不是a:。

java -cp . - apache4 - j- 1.16 /log4j-1.2.16 jar; /vensim.jar SpatialModel vars

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


你必须设置类路径,如果你得到错误:

无法找到或加载主类XYZ

例如:

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

如果你在Eclipse中工作,只需要做一个清理(project\clean..清理项目的所有项目)。


我使用的是Java 1.8,当我在NetBeans中按下“构建和清理”键时,突然出现了这个错误。我再次短暂切换到1.7,单击OK,重新打开属性并切换回1.8,一切都很完美。

我希望我能帮助一些人解决这个问题,因为这些错误可能相当耗时。


这为我解决了今天的问题:

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

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


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


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


我得到这个错误是因为我试图运行

javac HelloWorld.java && java HelloWorld.class

当我应该删除。class:

javac HelloWorld.java && java HelloWorld

您必须在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

在窗户上,同样的事情也会起作用,我已经尝试过了


This problem occurred for me when I imported an existing project into eclipse. What happens is it copied all the files not in the package, but outside the package. Hence, when I tried run > run configurations, it couldn't find the main method because it was not in the package. All I did was copy the files into the package and Eclipse was then able to detect the main method. So ultimately make sure that Eclipse can find your main method, by making sure that your java files are in the right package.


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

重新启动IDE后,一切都恢复正常。


如果类在包中

package thepackagename;

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

然后调用:

java -classpath . TheClassName

导致错误:无法找到或加载主类classname。这是因为它必须用它的全限定名调用:

java -classpath . thepackagename.TheClassName

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

需要明确的是,这个类的名称不是classname,而是packagename. classname。尝试执行classname不能工作,因为不存在具有该名称的类。反正不在当前类路径上。

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


如果比很多人想的简单,包括我在内:)

cd到项目文件夹/src/package,在那里你会看到yourClass.java,然后运行javac yourClass.java,它会创建yourClass.class,然后从src文件夹中cd到build文件夹中,你可以运行java package. youclass

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


如果您正在使用Eclipse……我重命名了我的主类文件,得到了这个错误。我转到“Run As”配置器,在该项目的类路径下,它在类路径中列出了两个文件。我删除了我重命名的旧类,并留下了具有新名称的类,它编译和运行正常。


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

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


如果遇到这个错误,并且正在使用Maven构建jar,那么很有可能只是在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中。