今天遇到一个问题:在cmd命令行中,用javac编译java文件能够成功,可是用java执行却提示“找不到或没法加载主类”。现将该问题的缘由以及解决办法记录一下。html
先理解一下系统变量path和classpath的做用。java
path:可执行命令的搜索路径,在该路径下搜索能够运行的程序或批处理文件。
命令行中输入一个命令,则会在path配置的目录中查找该命令,若是存在则调用该程序运行,若是不存在则提示“ 'XXX' 不是内部或外部命令,也不是可运行的程序或批处理文件。”
若是要想在cmd中执行java,则须要把java.exe 配置在path系统变量中。因为cmd会搜索path中目录下的文件,所以在实际配置的时候,只须要把../jre/bin 配置到path中便可。这样,在执行java时,操做系统便会自动在../jre/bin 目录下搜索java.exe 可执行程序了。jvm
classpath: 类文件(*.class/*.jar)的存储路径。
java 命令执行时,会读取classpath中配置的目录,而后在该目录下去搜索将要执行的.class文件。若是未搜索到,则会报“找不到或没法加载主类”错误,若是搜索到,则继续运行。
例如:执行命令 java Hello;
则java程序会去在classpath配置的全部目录和文件中取搜索Hello.class文件,找到以后会把该class文件加载到jvm中,为后面的运行作准备。
classpath这个系统变量只是为java使用的,其余程序不会使用该变量。spa
如上所说,java执行时,会在classpath中搜索 XXX.class 文件,若是找不到则报出"找不到或没法加载主类"的错误。那么在cmd运行的时候,咱们会随意的在某个目录下面javac编译,而后java运行程序,那么,该目录未配置到classpath中,java程序又是如何找到该目录的呢?操作系统
还记得配置classpath的时候,有一个".;"的配置项吗?其表明的就是执行java命令是的所在目录,也便是当前目录。这样便是把当前目录加入了classpath,所以java执行的时候,会在当前目录中搜索XXX.class 的。命令行
注意,当配置 .; 的时候,必定要注意前面是否是还有其余配置。classpath中多个目录要以;分割,而这里的"."是一个配置项,表明的当前目录,因此,若是"."前面有其余的配置项,则前面一样须要加入";"。
例如:
"."前面有其余配置项,则这样配: ...\bin;.;%JAVA_HOME%\bin.......
"."前面无其余配置项(也便是classpath是以.开始的),则这样配: .;%JAVA_HOME%\bin.......
注意,在配置的时候必定要肯定究竟是";.;"仍是".;", 不然若是配成...\bin.;%JAVA_HOME%\bin.......则就会发生:可以javac编译成功,可是java却没法执行成功的错误。htm
另:用户变量会覆盖掉系统变量blog
环境变量不区分大小写get
===============================================cmd
原文连接:记一次解决cmd中执行java提示"找不到或没法加载主类"的问题 转载请注明出处!
===============================================
---end--