从CMD窗口运行Java程序出现的程序包XXX不存在、找不到或无法加载主类XXX问题详解
Java源文件所在目录
文件一:E:\com\test\Test.java
package com.test;
import com.packageaccess.*;
public class Test {
public static void main(String[] args) {
PackageAccess PA = new PackageAccess();
}
}
文件二:E:\com\packageaccess
package com.packageaccess;
public class PackageAccess {
public PackageAccess(){
System.out.println("This is com.packageaccess.PackageAccess Class!");
}
}
问题一:程序包XXX不存在
在test目录下通过cmd命令窗口编译Test.java文件复现该问题,如图:
解决办法:在com目录的父目录中通过cmd窗口执行javac com\test\Test.java,如图:
问题二:找不到或无法加载主类XXX
在test目录下通过cmd命令窗口编译Test.java文件复现该问题,如图:
解决办法:在com目录的父目录中通过cmd窗口执行java com.test.Test,如图:
问题分析
Java中完整的类名应该是包名+类名,本文中的两个Java源程序的包的公共路径都为com,当我们在test目录下编译Test.java文件时,虚拟机会认为我们Test.java文件的位置为:test\com\test\Test.java,然后以此去查找com.packageaccess包,当然查找失败!
同理,当我们在test目录下通过java命令运行Test时,虚拟机默认在test\com\test下去查找Test.class文件,当然查找不到!
此问题的原因可归结到环境变量CPASSPATH的设置上,在CLASSPATH中,“.”表示当前目录。
Java解释器的运行过程:首先,找出环境变量CLASSPATH(可以通过操作系统来设置)。CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径(例如,package com.test就变成为com\test或com/test或其他,这将取决于操作系统)。得到的路径会与CLASSPATH中的各个不同的根目录路径相连接以获得一个完整的目录路径,解释器就在这些目录中查找与你所需要的类名称相同的.class文件(此外,解释器还会去查找某些涉及Java解释器所在位置的标准目录)。所以在这里Java寻找的就是CLASSPATH+package名。
参考链接:
https://blog.csdn.net/ncc1995/article/details/84932759
https://blog.csdn.net/weixin_45655555/article/details/106469076