从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!");
		}
}

cmdjava命令找不到 javacmd找不到文件怎么办_java

问题一:程序包XXX不存在

在test目录下通过cmd命令窗口编译Test.java文件复现该问题,如图:

cmdjava命令找不到 javacmd找不到文件怎么办_Test_02


解决办法:在com目录的父目录中通过cmd窗口执行javac com\test\Test.java,如图:

cmdjava命令找不到 javacmd找不到文件怎么办_Java_03

问题二:找不到或无法加载主类XXX

在test目录下通过cmd命令窗口编译Test.java文件复现该问题,如图:

cmdjava命令找不到 javacmd找不到文件怎么办_Java_04


解决办法:在com目录的父目录中通过cmd窗口执行java com.test.Test,如图:

cmdjava命令找不到 javacmd找不到文件怎么办_cmdjava命令找不到_05

问题分析

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中,“.”表示当前目录。

cmdjava命令找不到 javacmd找不到文件怎么办_java_06


Java解释器的运行过程:首先,找出环境变量CLASSPATH(可以通过操作系统来设置)。CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径(例如,package com.test就变成为com\test或com/test或其他,这将取决于操作系统)。得到的路径会与CLASSPATH中的各个不同的根目录路径相连接以获得一个完整的目录路径,解释器就在这些目录中查找与你所需要的类名称相同的.class文件(此外,解释器还会去查找某些涉及Java解释器所在位置的标准目录)。所以在这里Java寻找的就是CLASSPATH+package名。