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

我在编译和运行我的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”方法(如下所示),所以我不确定问题是什么-有人能帮帮我吗?谢谢。< / p >

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


}
1588320 次浏览

我认为您需要将当前目录添加到Java类路径中

java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
你必须确保你将你的.class文件的位置添加到你的类路径。因此,如果它在当前文件夹中,将.添加到类路径中。 注意,Windows类路径分隔符是一个分号,即;.

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

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:\sample < / p >

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

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

我知道这个问题被标记为linux,但在窗户上,你可能需要用;而不是:来分隔你的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

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

无法找到或加载主类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.. clean all projects)。

我使用的是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
  • 在窗户上,同样的事情也会起作用,我已经尝试过了

当我将一个现有项目导入eclipse时,出现了这个问题。它复制的文件不是包里的,而是包外的。因此,当我尝试运行>运行配置时,它无法找到主方法,因为它不在包中。我所做的只是将文件复制到包中,然后Eclipse就能够检测到主方法了。因此,通过确保java文件位于正确的包中,最终确保Eclipse能够找到您的主方法。

我使用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

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

java -classpath . thepackagename.TheClassName

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

需要明确的是,这个类的名称不是TheClassName,而是thepackagename.TheClassName。尝试执行TheClassName是行不通的,因为不存在具有此名称的类. c。反正不在当前类路径上。

最后,请注意编译后的(__abc .java)版本。因此“路径”。

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

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

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

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

java -verbose:class 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中。