今天遇到一个问题:在cmd命令行中,用javac编译java文件可以成功,但是用java执行却提示“找不到或无法加载主类”。现将该问题的原因以及解决办法记录一下。
先理解一下系统变量path和classpath的作用。
path:可执行命令的搜索路径,在该路径下搜索可以运行的程序或批处理文件。
命令行中输入一个命令,则会在path配置的目录中查找该命令,如果存在则调用该程序运行,如果不存在则提示“ 'XXX' 不是内部或外部命令,也不是可运行的程序或批处理文件。”
如果要想在cmd中执行java,则需要把java.exe 配置在path系统变量中。由于cmd会搜索path中目录下的文件,因此在实际配置的时候,只需要把../jre/bin 配置到path中即可。这样,在执行java时,操作系统便会自动在../jre/bin 目录下搜索java.exe 可执行程序了。
classpath: 类文件(*.class/*.jar)的存储路径。
java 命令执行时,会读取classpath中配置的目录,然后在该目录下去搜索将要执行的.class文件。如果未搜索到,则会报“找不到或无法加载主类”错误,如果搜索到,则继续运行。
例如:执行命令 java Hello;
则java程序会去在classpath配置的所有目录和文件中取搜索Hello.class文件,找到之后会把该class文件加载到jvm中,为后面的运行做准备。
classpath这个系统变量只是为java使用的,其他程序不会使用该变量。
如上所说,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却无法执行成功的错误。
另:用户变量会覆盖掉系统变量
环境变量不区分大小写
===============================================
原文链接:记一次解决cmd中执行java提示"找不到或无法加载主类"的问题 转载请注明出处!
===============================================
---end--