错误:无法find或加载主类
我无法编译和运行我的Java代码,目的是为了让我能够将Java与Vensim(一个仿真build模包)的共享对象连接起来。
下面的代码编译没有错误:
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
我得到以下错误:“错误:无法find或加载主类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)); } }
您必须确保将您的.class
文件的位置添加到您的类path中。 所以,如果它在当前文件夹中,然后添加.
到你的类path。 请注意,Windows类path分隔符是一个分号,即;
如果class级在一个包里
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
目录必须存在于类path中。 在这个例子中.
,即当前目录,是整个类path。 因此,必须从包名称所在的目录中调用此特定示例。
要清楚的是,这个类的名称不是TheClassName
,它是thepackagename.TheClassName
的名称。类名。 尝试执行TheClassName
不起作用,因为没有具有该名称的类存在 。 不pipe在当前的classpath中。
最后,请注意编译( .class)版本被执行,而不是源代码( .java)版本。 因此,“CLASSPATH”。
你可以尝试这两个,当你得到的错误:'无法find或加载主类'
如果您的类文件保存在HelloWorld
程序名称d:\sample
以下目录中
-
java -cp d:\sample HelloWorld
-
java -cp . HelloWorld
我相信你需要将当前目录添加到Java类path中
java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
你必须包括classpath到你的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
- 在Windows中,同样的事情也会起作用,我已经尝试过了
如果你在Eclipse中工作,只需要清理( project\clean..
clean all projects
)的项目。
如果出现错误,您必须设置类path:
无法find或加载主类XYZ
例如:
E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin" E:\>set classpath=%classpath%;.; E:\>javac XYZ.java E:\>java XYZ
我得到这个错误,因为我试图运行
javac HelloWorld.java&&java HelloWorld.class
当我应该删除.class
:
javac HelloWorld.java&&java HelloWorld
检查你的BuildPath,这可能是你正在引用一个不存在的库。
我知道这个问题被标记为Linux,但在Windows上 ,你可能需要分开你的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
如果您尝试运行需要JDK 1.6的Java应用程序,并且您尝试在JDK 1.4上运行,那么您将遇到此错误。 一般来说,尝试在旧的JRE上运行java appliation可能会失败。 尝试安装新的JRE / JDK
如果你得到这个错误,并且你正在使用Maven来构build你的Jars ,那么很可能你在src/main/java/
没有你的Java类。
在我的情况下,我在Eclipse中创build了我的项目,默认为src
(而不是src/main/java/
。
所以我结束了像mypackage.morepackage.myclass
和目录结构看起来像src/mypackage/morepackage/myclass
,这本质上没有任何错误。 但是当你运行mvn clean install
它会查找src/main/java/mypackage/morepackage/myclass
。 它不会find类,但它也不会错误。 所以它会成功地构build,当你运行你输出的Jar时,结果是:
Error: Could not find or load main class mypackage.morepackage.myclass
因为它根本不包括你的类在打包的jar子里。
项目>清理,然后确保BuildPath>库具有正确的库。
java -verbose:class HelloWorld
可以帮助你理解哪些类正在被加载。
另外,如前所述,请记住调用完全限定的名称(即包括包)。
问题不在于你的主要function。 退房
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,并且当我在netbeans中按下“Build and clean”时突然出现这个错误,我再次切换到1.7,点击OK,重新打开属性并切换回1.8,一切正常。
我希望我可以帮助这个人,这些错误可能会相当耗时。
当我将一个现有的项目导入到eclipse中时,发生了这个问题。 它会复制所有不在包中的文件,而是在包之外。 因此,当我尝试运行>运行configuration时,找不到主要方法,因为它不在包中。 我所做的只是将文件复制到软件包中,然后Eclipse能够检测到主要方法。 所以最终确保Eclipse可以find你的主要方法,确保你的java文件在正确的包中。
如果你正在使用Eclipse …我重命名我的主类文件,并得到该错误。 我去了“Run As”configuration器,并在该项目的类path下,它已经列出了类path中的两个文件。 我删除了旧的类,我重命名,离开了新名称的类,它编译和运行得很好。
如果比许多人想象的那么简单,我包括:)
CD到Project Folder/src/package
那里你应该看到yourclass.java然后运行javac yourClass.java
这将创buildyourClass.class然后cd出src
文件夹,并进入生成文件夹那里你可以运行java package.youClass
我正在使用Mac上的terminal,或者您可以使用Windows上的命令提示符完成相同的任务
这为我今天解决了这个问题:
cd /path/to/project cd build rm -r classes
然后清理并构build它并运行您需要的单个文件。
我在Windows中有一个类似的问题,它与类path有关。 从命令行导航到Java文件(* .java和* .class)所在的目录,然后再次尝试使用命令。
我使用Anypoint Studio(基于Eclipse的IDE)。 在我的情况下,一切运行良好,直到我发现在运行Java代码时,执行完全不同的东西。 然后我删除了.class文件。 在这之后,我从这个问题的标题中得到错误信息。 清理项目并没有解决问题。
重新启动IDE后,再次运行良好。