我在编译和运行我的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
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行以下内容时:
java -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:"错误:无法找到或加载主类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));
}
}
Run Code Online (Sandbox Code Playgroud)
Sak*_*ket 264
您必须确保将.class文件的位置添加到类路径中.因此,如果它在当前文件夹中,则添加.到您的类路径中.请注意,windows类路径分隔符是一个分号ie;
ali*_*ind 133
如果班级在一个包中
package thepackagename;
public class TheClassName {
public static final void main(String[] cmd_lineParams) {
System.out.println("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话:
java -classpath . TheClassName
Run Code Online (Sandbox Code Playgroud)
结果Error: Could not find or load main class TheClassName.这是因为必须使用其完全限定名称来调用它:
java -classpath . thepackagename.TheClassName
Run Code Online (Sandbox Code Playgroud)
此thepackagename目录必须存在于类路径中.在此示例中.,表示当前目录,是类路径的整体.因此,必须从thepackagename存在的目录中调用此特定示例.
要清楚,这个类的名字不是TheClassName,它是thepackagename.TheClassName.尝试执行TheClassName不起作用,因为不存在具有该名称的类.不管怎样,不在当前的类路径上.
最后,请注意执行编译的(.class)版本,而不是源代码( .java)版本.因此"CLASSPATH".
小智 60
当你收到错误时可以尝试这两个:'找不到或加载主类'
如果您的类文件保存在具有HelloWorld程序名称的
以下目录中d:\sample
java -cp d:\sample HelloWorldjava -cp . HelloWorldRaf*_*nes 37
我相信您需要将当前目录添加到Java类路径中
java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
Run Code Online (Sandbox Code Playgroud)
Muh*_*man 32
您必须在您的javac和java命令中包含classpath
javac -cp . PackageName/*.java
java -cp . PackageName/ClassName_Having_main
Run Code Online (Sandbox Code Playgroud)
假设您有以下内容
包名为:com.test类名:Hello(拥有main)文件位于"src/com/test/Hello.java"中
来自外部目录:
$ cd src
$ javac -cp . com/test/*.java
$ java -cp . com/test/Hello
Run Code Online (Sandbox Code Playgroud)
小智 18
如果出现错误,则必须设置类路径:
无法找到或加载主类XYZ
例如:
E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.java
E:\>java XYZ
Run Code Online (Sandbox Code Playgroud)
Lri*_*Lri 17
我收到此错误是因为我试图运行
javac HelloWorld.java && java HelloWorld.class
Run Code Online (Sandbox Code Playgroud)
什么时候我应该删除.class:
javac HelloWorld.java && java HelloWorld
Run Code Online (Sandbox Code Playgroud)
小智 8
如果您尝试运行需要JDK 1.6的Java应用程序并且您尝试在JDK 1.4上运行,那么您将遇到此错误.通常,尝试在旧JRE上运行Java appliation可能会失败.尝试安装新的JRE/JDK
我知道这个问题是用linux标记的,但是在Windows上,你可能需要用c ;而不是a 来分隔你的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
如果您收到此错误并且您正在使用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时,结果是:
Error: Could not find or load main class mypackage.morepackage.myclass
Run Code Online (Sandbox Code Playgroud)
因为它根本就没有将您的类包含在打包的Jar中.
问题与你的主要功能无关.退房
javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java VensimHelper.java VensimException.java VensimContextRepository.java
Run Code Online (Sandbox Code Playgroud)
输出并运行它.
我使用的是Java 1.8,当我在NetBeans中按下“ Build and clean”时突然发生此错误。我再次短暂切换到1.7,单击“确定”,重新打开属性,然后切换回1.8,一切正常。
我希望我可以帮助别人解决这些问题,因为这些错误可能会非常耗时。
当我将现有项目导入eclipse时,这个问题就发生了。发生的情况是,它复制了所有不在软件包中但在软件包外部的文件。因此,当我尝试运行>运行配置时,找不到主方法,因为它不在软件包中。我所做的就是将文件复制到软件包中,然后Eclipse能够检测到主要方法。因此,通过确保Java文件位于正确的包中,最终确保Eclipse可以找到您的主要方法。
小智 5
如果它比许多人想象的那么简单,我会包括在内:)
cd到Project Folder/src/package那里,您应该看到yourClass.java然后运行javac yourClass.java,它将创建yourClass.class,然后cd出src文件夹并进入build您可以运行的文件夹java package.youClass
我在Mac上使用终端,也可以在Windows上使用命令提示符来完成相同的任务
小智 5
如果您使用的是Eclipse ...,我重命名了主类文件并得到了该错误。我去了“运行方式”配置器,在该项目的类路径下,它在类路径中列出了两个文件。我删除了重命名的旧类,并留下了具有新名称的类,它编译并运行得很好。