我在编译和运行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));
}
}
答案 0 :(得分:257)
您必须确保将.class
文件的位置添加到类路径中。因此,如果它在当前文件夹中,则将.
添加到类路径中。
请注意,windows类路径分隔符是一个分号,即;
答案 1 :(得分:127)
如果班级在包中
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
不起作用,因为不存在具有该名称的类。不管怎样,不在当前的类路径上。
最后,请注意已执行编译的( .class)版本,而不是源代码( .java)版本。因此“CLASSPATH。”
答案 2 :(得分:58)
当您收到错误时,可以尝试这两个:'找不到或加载主类'
如果您的班级文件使用HelloWorld
程序名保存在以下目录中
d:\sample
java -cp d:\sample HelloWorld
java -cp . HelloWorld
答案 3 :(得分:36)
我认为您需要将当前目录添加到Java类路径
java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
答案 4 :(得分:30)
您必须在您的javac和java命令中包含classpath
javac -cp . PackageName/*.java
java -cp . PackageName/ClassName_Having_main
假设您有以下
包名为:com.test 班级名称:你好(有主) 文件位于&#34; src / com / test / Hello.java&#34;
内来自外部目录:
$ cd src
$ javac -cp . com/test/*.java
$ java -cp . com/test/Hello
答案 5 :(得分:25)
如果您在Eclipse中工作,只需清理(project\clean..
clean all projects
)项目。
答案 6 :(得分:17)
如果收到错误,则必须设置类路径:
无法找到或加载主类XYZ
例如:
E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.java
E:\>java XYZ
答案 7 :(得分:16)
我收到此错误是因为我试图运行
javac HelloWorld.java && java HelloWorld.class
我应该删除.class
:
javac HelloWorld.java && java HelloWorld
答案 8 :(得分:9)
检查您的BuildPath,可能是您正在引用一个不再存在的库。
答案 9 :(得分:7)
如果您尝试运行需要JDK 1.6的Java应用程序并且您尝试在JDK 1.4上运行,那么您将遇到此错误。通常,尝试在旧JRE上运行Java appliation可能会失败。尝试安装新的JRE / JDK
答案 10 :(得分:7)
我知道这个问题是用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
答案 11 :(得分:6)
如果您收到此错误并且使用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中。
答案 12 :(得分:5)
项目&gt;清理然后确保BuildPath&gt;图书馆有正确的图书馆。
答案 13 :(得分:5)
java -verbose:class HelloWorld
可能会帮助您了解正在加载哪些类。
另外,如前所述,请记住调用完整的限定名称(即包括包)。
答案 14 :(得分:5)
问题不在于你的主要功能。查看
javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java VensimHelper.java VensimException.java VensimContextRepository.java
输出并运行它。
答案 15 :(得分:4)
当我将现有项目导入eclipse时,我遇到了这个问题。会发生什么情况,它会复制不在包中但在包外的所有文件。因此,当我尝试运行&gt;运行配置,它无法找到主要方法,因为它不在包中。我所做的只是将文件复制到包中,然后Eclipse能够检测到主要方法。因此,最终确保Eclipse可以找到您的主要方法,确保您的java文件位于正确的包中。
答案 16 :(得分:4)
我使用的是Java 1.8,当我按下&#34;构建和清理&#34;这个错误突然发生了。在netbeans中,我再次短暂切换到1.7,点击确定,重新打开属性并切换回1.8,一切都运行良好。
我希望我可以帮助别人,这些错误可能非常耗时。
答案 17 :(得分:4)
如果比许多人想象的那么简单,我包括:)
cd到 Project Folder/src/package
,您应该看到yourClass.java然后运行 javac yourClass.java
,这将创建yourClass.class然后cd出< em> src
文件夹并进入 build
文件夹,您可以运行 java package.youClass
我在Mac上使用终端,或者您可以使用Windows上的命令提示符完成相同的任务
答案 18 :(得分:4)
如果您正在使用Eclipse ...我重命名了我的主类文件并得到了该错误。我去了“运行方式”配置程序,在该项目的类路径下,它已在类路径中列出了这两个文件。我删除了我重命名的旧类,并离开了具有新名称的类,并编译并运行得很好。
答案 19 :(得分:1)
我在Windows中遇到类似的问题,它与类路径有关。从命令行,导航到它所在的Java文件所在的目录(* .java和* .class),然后再次使用您的命令。
答案 20 :(得分:1)
今天我解决了这个问题:
cd /path/to/project
cd build
rm -r classes
然后清理并构建它并运行您需要的各个文件。
答案 21 :(得分:1)
我使用Anypoint Studio(基于Eclipse的IDE)。在我的情况下,一切运行良好,直到我发现在运行java代码时,执行完全不同的东西。然后我删除了.class文件。在这一点之后,我从这个问题的标题中得到了错误消息。清理项目并没有解决问题。
重新启动IDE后,一切都运行良好。