java运行时找不到或无法加载主类

首先,让我们简单了解一下怎样使用java命令来运行java程序的正确方法 。
语法是这样的:
java [<options>] <class-name> [<arg> …]
其中<option>是命令行选项(以“-”字符开头) , <class-name>是Java类完整名称(FQN),包括类所在的包,比如说packagename.packagename2.ClassName,或者packagename/packagename2/ClassName , 而<arg>是传递给应用程序的命令行参数 。举个例子:
java -Xmx100m com.hello.world.HelloWorld arg1 arg2
上面这个命令会执行以下操作:

  1. 搜索com.hello.world.HelloWorld类的字节码
  2. 加载类
  3. 判断类是否包含主方法入口
  4. 调用主方法入口,并把参数arg1和arg2传递给它
当出现“找不到或无法加载主类…”的情况时,表明第一步已失败,Java命令无法找到类 。并且在错误消息中会给出正在寻找的类名 。
下面说一说为什么会出现找不或者无法加载类的原因:
1 类名错误
第一个可能的原因是类名错误 , 或者正确的类名 , 但格式错误 。
类名需要保证:拼写正确(包括大小写),并且完整(包名要包括在内) 。
2 类路径错误
2.1 类路径设置错误
类路径(CLASSPATH)是Java运行时环境搜索类和其它资源文件的路径 。
类路径的设置的完整解释可以去看一下Oracle文档,这里给出一个简单的说明 。
windows下类路径的设置命令:
set CLASSPATH=classpath1;classpath2…
Linux下类路径的设置命令:
export CLASSPATH=”classpath1:classpath2…”
注意,windows和linux使用的分隔符不同,windows是“;” , linux是“:”.
也可以在运行时使用-cp选项来指定类路径:
java -cp classpath <class-name> [<arg> …]
设置类路径时,它应该对应于类完整名称的根目录 。
2.2 子目录和类完整名(FQN)不匹配
比如,如果类的完整名称是com.hello.world.HelloWorld,那么JVM查找时,会在子目录“com/hello/world”中找名为HelloWorld的类 。如果子目录与包命名不匹配,也会导致JVM将找不到类 。
如果编译后曾经移动过类或者重命名了类,也会导致命令运行失败,但是导致的错误将会是java.lang.NoClassDefFoundError,并不是找不到或者无法加载类 。
给个完整的例子
想运行com.hello.world.HelloWorld类 , 
完整的文件路径是/java/coding/com/hello/world/HelloWorld.class,
当前的工作目录是/java/coding/,
那么运行:
java com.hello.world.HelloWorld
如果当前工作目录是/java/coding/com/hello/world/,
那么需要指定类路径(类路径可以是相对路径也可以是完全路径):
java -cp ../../../ com.hello.world.HelloWorld
3 类路径中缺少类的依赖dependencies
类路径需要包括所有程序依赖的其它(非系统)的类 。系统类是自动定位的,但需要确保非系统类在类路径当中,方法如上所示 。
【java运行时找不到或无法加载主类】
希望这个解答可以帮到你 。

经验总结扩展阅读