之前一直用Eclipse写程序,运行,没有出什么问题。今天突然想再试一下用cmd编译运行程序。可是发现javac的时候还好,java的时候总是显示错误如下:
E:\Study\Java>java TestScanner
Exception in thread "main" java.lang.NoClassDefFoundError: TestScanner
Caused by: java.lang.ClassNotFoundException: TestScanner
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 java.lang.ClassLoader.loadClassInternal(Unknown Source)
关键是那个Unknown Source,我查了一下,说是数据库没连接上。这就很奇怪,以前用命令行的时候没有出现过这种问题,而且我也没改环境变量什么的。我搜呀搜呀,终于发现了一篇文章!!!!!!
原文参见http://hi.baidu.com/liusha0007/blog/item/362be58106dbb5dfbd3e1e0a.html
原来是路径Path的问题。
因为最近我安装了许多程序,所以导致%JAVA_HOME%\bin;排在了中间,可能前面的d:\Program Files\MATLAB\R2010b\bin;影响?
(百度知道:path(环境变量)是dos以前的内部命令,windows继续沿用至今。用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找。一般设定java的时候为了在任何目录下都可以运行bin文件夹下的命令。就将java的bin目录声明到path中。
在dos下运行path命令就可以设定或查看。在windows中要在系统设置中设定。)
然后我就把%JAVA_HOME%\bin;移到PATH的开头,终于!!!!——
E:\Study\Java>java TestScanner
Exception in thread "main" java.lang.NoClassDefFoundError: TestScanner
Caused by: java.lang.ClassNotFoundException: TestScanner
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
……………………………………
我哭了。
source找到了,可是类文件还是找不到。
检查来检查去,这个Class文件就在当前目录下,文件名也没错的啊,为什么找不到?(虽然这个类文件不在ClassPath中,但是似乎在当前目录下就可以被找到啊,以前试过,没问题啊啊啊啊啊)
再搜……
终于找到,有神人指出,在classpath最前面加个 .;
追随着圣人的指点,我终于成功地运行了!流下激动的泪水……
---------------------------------------------------------------------------------------------------
原来,.; 代表当前目录。“如果我们在系统环境变量中设置了CLASSPATH的话,在命令行中通过java运行的时候如果再不指定CLASSPATH参数,那么就会导致java虚拟机只是按照CLASSPATH环境变量中的目录搜索类,而不在你的当前目录下搜索类。”(原文参见http://blog.sina.com.cn/s/blog_5198c7370100cxsk.html)
这点我还是不确定,因为我之前的经验是不加.; ,也还会是在当前目录下搜索类的。而且我在书上似乎看过类似的话(支持我的观点)。不知道为什么突然不管用了。