找不到或无法加载主类

来源:互联网 发布:linux 查看权限命令 编辑:程序博客网 时间:2024/05/16 09:57

如果你在控制台中运行java, javac, java -version都没问题,那么你遇到的或许是和我同样的问题。

造成这个问题的原因,这要从Java解释器的工作原理说起。

Java解释器的运行过程如下:首先,找到环境变量CLASSPATH(可以通过操作系统,有时也可以通过在你的机器上安装Java或Java-based工具的安装程序来设置。)
CLASSPATH包含了一个或多个目录,用来作为查找.class文件的根目录。从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠以从CLASSPATH根中产生一个
路径名称(于是,package foo.bar.baz 就变成为foo\bar\baz或foo/bar/baz或者其它什么东东,这一切取决于你的操作系统)。得到的路径会与CLASSPATH中各个不同
的项相连接,解释器就在这些目录查找你要执行的程序相关的.class文件。

第一次学习Java时,遇到这个问题,不知道当时怎么解决的。第二次学习又遇到这个问题,浪费了不少时间。

先来重现问题:

1 新建Java工程

2 新建Class,package名字为main,类名为Test

3 Eclipse在工程目录下新建main文件夹,并在main文件夹中创建文件Test.java

4 完成Hello World程序。更改Test.java文件,其内容更新为:

package main;public class Test {public static void main(String[] args){System.out.println("Hello World!");}}
5 cd到Test.java所在的目录

C:\Documents and Settings\Administrator>cd /d F:\workspace\learn\main
F:\workspace\learn\main>javac Test.java
F:\workspace\learn\main>java Test
Exception in thread "main" java.lang.NoClassDefFoundError: Test (wrong name: main/Test)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

F:\workspace\learn\main>

执行出错

6 正确的方式是cd到main(package名称)所在的目录,然后执行java main.Test

F:\workspace\learn\main>cd ..
F:\workspace\learn>java main.Test
Hello World!
F:\workspace\learn>

如果package名字采用默认的空,这表现在Test.java中没有import package这样的行

那么执行的时候就可以直接输入java Test

这个问题主要需要明白两点:

1 Java解释器根据CLASSPATH的值和类名生成查找路径

2 类名还包括package名称,即package名称是类名的一部分。