如果你在控制台中运行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名称是类名的一部分。