使用java命令运行class文件提示“错误:找不到或没法加载主类“的问题分析

有时候咱们须要直接用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要加各类包等等都是泛泛而谈,真正静下心分析这个问题的资料很少。不少都没有说到点子上,会误导人的。

相关文章
相关标签/搜索