Error: Could not find or load main class
我在编译和运行Java代码时遇到了麻烦,这是为了允许我用Java与一个共享对象进行接口,它是VimSM,一个仿真建模包。
以下代码编译时不会出错:
1 | javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java VensimHelper.java VensimException.java VensimContextRepository.java |
但是,当我尝试运行以下命令时:
1 | java -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars |
我得到以下错误:"错误:无法找到或加载主类空间模型"。我的spacemodel.java代码确实包含一个"main"方法(如下),所以我不确定问题是什么-有人能帮我吗?谢谢。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 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 \tdll lib:" + libName +" \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)); } } |
必须确保将
如果类在包中
1 2 3 4 5 6 7 |
然后打电话:
1 | java -classpath . TheClassName |
结果出现
1 | java -classpath . thepackagename.TheClassName |
而且这个
很明显,这个类的名字不是
最后,注意编译的(.class)版本是执行的,而不是源代码(.java)版本。因此是"类路径"。
当出现以下错误时,可以尝试这两种方法:"找不到或加载主类"
如果类文件用
我相信您需要将当前目录添加到Java类路径中。
1 | java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars |
必须将类路径包含到JavaC和Java命令中。
1 2 | javac -cp . PackageName/*.java java -cp . PackageName/ClassName_Having_main |
假设你有以下几点
名为:com.test的包班级名称:你好(有主班)文件位于"SRC/COM/Test/Hello,Java"的内部。
从外部目录:
1 2 3 | $ cd src $ javac -cp . com/test/*.java $ java -cp . com/test/Hello |
- 在Windows中,同样的东西也会起作用,我已经尝试过了
如果您在Eclipse中工作,只需对项目进行清理(
如果出现错误,则必须设置类路径:
Could not find or load main class XYZ
例如:
1 2 3 4 | E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin" E:\>set classpath=%classpath%;.; E:\>javac XYZ.java E:\>java XYZ |
我犯这个错误是因为我想跑
1 | javac HelloWorld.java && java HelloWorld.class |
当我本应移除
1 | javac HelloWorld.java && java HelloWorld |
检查您的buildPath,可能是您正在引用一个不再存在的库。
如果您试图运行一个需要JDK 1.6的Java应用程序,而您正试图在JDK 1.4上运行,那么您将遇到这个错误。一般来说,试图在旧JRE上运行Java应用程序可能失败。尝试安装新的JRE/JDK
我知道这个问题是用Linux标记的,但是在Windows上,您可能需要用
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
如果你得到这个错误,并且你使用Maven来构建你的JAR,那么你就很可能在EDCOX1 13中没有Java类。
在我的例子中,我在Eclipse中创建了我的项目,它默认为
因此,我最终得到了类似于
1 |
因为它根本没有将类包含在打包的jar中。
项目>清理,然后确保BuildPath>库具有正确的库。
另外,如前所述,记住调用完整的限定名(即include package)。
问题不在于你的主要功能。退房
1 | javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java VensimHelper.java VensimException.java VensimContextRepository.java |
输出并运行它。
我正在使用Java 1.8,当我在NETBeBes中按下"构建和清理"时,这个错误突然发生了,我再次切换了1.7分钟,点击OK,重新打开的属性并切换回1.8,一切都运行得很好。
我希望我能帮助别人解决这个问题,这些错误可能会非常耗时。
当我将一个现有的项目导入Eclipse时,出现了这个问题。结果是它复制了不在包中但在包外部的所有文件。因此,当我尝试运行>运行配置时,它找不到主方法,因为它不在包中。我所做的只是将文件复制到包中,然后Eclipse能够检测到主要方法。因此,最终确保伊柯丽斯可以找到你的主要方法,确保你的Java文件在正确的包中。
如果比许多人想象的那么简单,我也包括在内:)
cd到
我在Mac上使用终端,或者您可以使用Windows上的命令提示来完成相同的任务。
如果你使用Eclipse…我重命名了我的主类文件并得到了那个错误。我进入了"运行方式"配置程序,在该项目的类路径下,它在类路径中列出了这两个文件。我删除了重新命名的旧类,留下了具有新名称的类,它编译后运行得很好。
我在Windows中也有类似的问题,它与类路径有关。从命令行导航到它所在的Java文件(*.java和*.class)所在的目录,然后用您的命令再试一次。
我使用AnyPointStudio(基于Eclipse的IDE)。在我的例子中,所有的工作都很好,直到我发现在运行Java代码时,执行了完全不同的操作。然后我删除了.class文件。在这之后,我从这个问题的标题中得到了错误消息。清理项目并没有解决问题。
重新启动IDE之后,一切都再次正常工作。
这解决了我今天的问题:
1 2 3 | cd /path/to/project cd build rm -r classes |
然后清除并生成它并运行所需的各个文件。