有时候咱们须要直接用jdk提供的java命令来执行class文件让软件运行起来,特别是不少初学者,但常常会发现以下提示:java
用eclipse或用ant则没有问题。app
其实缘由很简单,咱们忽略了2个细节。eclipse
1.java指令默认在寻找class文件的地址是经过CLASSPATH环境变量中指定的目录中寻找的。blog
2.咱们忽略了package的影响。ip
第一个问题好解决:编译
咱们直接在CLASSPATH环境变量中加入“.;”便可。“.”的意思是搜索当前目录class
第二个问题看下面分析:基础
看下面两个类变量
类A 类Bcli
类A和类B的惟一差异就是没有定义包名。
咱们的工程路径是D:\HelloWorld,在HelloWorld文件夹中创建一个src文件夹,类B的源代码文件就放在src中。用javac编译完之后
会在src文件夹中生成NewsManager.class,以下
执行以下:
如今咱们再把源代码换成类A
为何加入了package后就不对了呢?
类A中package的路径是org.will.app.main。按照java规定,咱们应该按照package定义的路径来存放源文件,类A应该放入:
src\org\will\app\main下,以下:
而后咱们编译执行:
依然有问题,为何,其实你们再回去看看java的书籍就会发现,一个类的全名应该是包名+类名。类A的全名:org.will.app.main.NewsManager
好的,再试试:
仍是不对。为何?
仔细看上面的图,咱们在main目录下让java命令去执行org.will.app.main.NewsManager,其实它会觉得类的路径是:
D:\HelloWorld\src\org\will\app\main\org\will\app\main\NewsManager,你们看到了吧,路径重复了。
因此,咱们应该这样执行:
成功!
总结:
1、java执行class文件是根据CLASSPATH指定的地方来找,不是咱们理解当前目录。若是但愿它查询当前目录,须要在CLASSPATH中加入“.;”,表明当前目录。
2、java执行class文件对package的路径是强依赖的。它在执行的时候会严格以当前用户路径为基础,按照package指定的包路径转化为文件路径去搜索class文件。各位同窗之后注意就OK啦。至于网上说的要在CLASSPATH要加各类包等等都是泛泛而谈,真正静下心分析这个问题的资料很少。不少都没有说到点子上,会误导人的。