前言
以前一直用Eclipse来运行Java程序,从未在命令行中编译运行过Java文件。直到最近某次运行别人写的bat文件时,出现“Could not find or load main class …“错误才开始了解如何通过命令行来编译运行Java文件。本文主要尝试说明导致这个错误的原因,以及如何解决。
注意:本文主要以Window下的CMD为讨论对象,linux环境不一定有效。
命令行中Java命令语法
首先,我们需要了解一个正确Java命令的格式是什么,如下所示:
java [ <option> ... ] <class-name> [<argument> ...]
其中option是以”-“开头的命令选项,例如-Xmx100m来指定运行程序时的最大堆内存为100m;class-name是需要运行Java程序的绝对路径;argument是指传入Java程序的参数。
以下面这条java命令为例:
java com.joey.test.date.DateTest
注:查资料说有的JDK版本,java类名不是用“.”来分割,有可能用“/”来分割,那么此时命令如下:
java com/joey/test/date/DateTest
在命令行中输入上面这条命令后(前提是你已经用javac对DateTest.java文件进行了编译),JVM会按以下步骤进行:
1. 需找com.joey.test.date.DateTest这个类编译的Java版本;
2. 将这个类load进来;
3. 检查这个类里面是否有main函数,以及是否有合适的修饰符;
4. 调用main函数或指定的方法;
导致报错的原因:
所以当我们得到这个Could not find or load main class …报错时,说明这条命令不能找到指定的类,在上面的第一步便失败了。有两个原因为导致这条命令找不到指定的Java类:
输入类名格式不正确
1.只简单输入了类的名字
java DateTest
当一个类在包com.joey.test.date下时,我们应该输入完整的路径
java com.joey.test.date.DateTest
2.只输入了类文件的名字
java DateTest.class
此时应该输入类文件的相对路径
java com/joey/test/date/DateTest.class
3.类名没有区分大小写
java com.joey.test.date.datetest
4.类名拼写错误
java com.joey.test.date.DataTest
classpath不正确
1.首先要确定你系统的环境变量CLASSPATH是否配置正确,我的配置如下:
.;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
2.检查命令行里的目录名称和JAR包名称是否正确
3.确定在error消息里面类的路径是有效的
在经过上述排查之后,我出现错误的原因是输入类的名称没有打全,并且不需要.java后缀。