Java配置path和classpath的含义详解

来源:互联网 发布:阿莫源码 编辑:程序博客网 时间:2024/05/22 01:28

​ 新入门java的同学经常会问我pathclasspath是什么意思,尤其会问classpath是什么意思,为什么只配置一个.就可以。下面以windows系统为例,做一个系统讲解。包含超详细实验数据,实验平台为windows10 + java 8.

1 path的含义

​ path是windows使用的系统环境变量,其作用是记录一些可运行的软件(例如java.exe, javac.exe)所在的位置,使得当我们可以方便快捷的打开这些软件。例如下图powershell中键入命令java -version

img/1.PNG

​ 此时,powershell就会在当前目录(即C:\Users\admin\Desktop)下寻找java.exe这个程序,如果没找到,powershell就会访问环境变量path,从path所记录的位置中从前到后一个一个去找java.exe这个软件,如果都找不到,就会报错java 不是可执行命令

​ 所以我们需要配置环境变量,将java.exe所在目录(例如C:\Program Files\Java\jdk1.8.0_102\bin)配置到path中去,之后powershell就会在 C:\Program Files\Java\jdk1.8.0_102\bin这个目录中找到java.exe这个软件,然后运行它,输出上图所示的结果。

​ 以上即是我们配置path环境变量的意义所在。

​ 最后简要说明一下:-version 是作为参数传给java.exe这个软件,意思是告诉java输出当前版本号。命令行的结构都是这样的 可执行软件 参数1 参数2 …,,第一个是软件名,后面的都是参数。

2 classpath的含义

​ classpath与path功能差不多,path指定的是windows上可运行的软件(一半xx.exe)的位置, classpath值java专用的,它指定的就是java中运行的文件(xx.class)的位置. 下面解释为什么只配置一个.就可以。

.是一种相对目录表示法,表示当前目录,与之对应的..表示当前目录的父目录。 什么是当前目录?以powershell为例解释,如下图:

d

  1. 第一行:当前目录是C:\Users\admin\Desktop\a,执行cd命令切换到父目录C:\Users\admin\Desktop;

  2. 第二行:当前目录是C:\Users\admin\Desktop,执行命令cd切换到父目录C:\Users\admin\

  3. 第三行:当前目录是C:\Users\admin\,执行cd命令切换到当前目录C:\Users\admin\

    了解了当前目录之后,说说classpath配置的.到底是什么含义,如下图:

    asdd

    ​ 当前目录C:\Users\admin\Desktop\a下有Main.class这个文件(.class是可执行文件,.java是源码)。

    ​ 当我们执行java Main这条命令,首先如上面解释,powershell根据path的配置找到java.exe运行它,java.exe运行后,接受参数Main,然后他就去访问classpath以寻找对应可执行Main.class文件,访问classpath之后发现配置的第一个目录是.,前面说过.代表当前目录,而现在的当前目录是C:\Users\admin\Desktop\a, 所以就在该目录下寻找Main.class文件,然后该目录下正好有Main.class这个文件,java就去执行这个文件输出对应结果。

    ​ 之后我们切换到父目录执行相同命令,注意现在的当前目录是C:\Users\admin\Desktop,然而在该目录下没有Main.class这个文件,所以就会抛出错误。

    ​ 以上就是配置classpath的作用了。

3 加深对classpath的理解

​ 现在我们修改环境变量classpath,如下图:

dds

​ 我们将.换成.\a,其意义根据前面的介绍就是当前目录下的a目录。

​ 现在我们来执行前面的java Main命令,如下图:

ss

​ 首先,与前面相同,当前目录C:\Users\admin\Desktop\a下有Main.class这个文件。

​ 当我们执行java Main这条命令,首先如上面解释,powershell根据path的配置找到java.exe运行它,java.exe运行后,接受参数Main,然后他就去访问classpath以寻找对应可执行Main.class文件,访问classpath之后发现配置的第一个目录是.\a,前面说过.\a代表当前目录下的a目录,而现在的当前目录是C:\Users\admin\Desktop\a, 那么./a就表示C:\Users\admin\Desktop\a\a,然而没有该目录,所以就会报出错误。

​ 之后我们切换到父目录执行相同命令,注意现在的当前目录是C:\Users\admin\Desktop,然后该目录下正好有a目录,a目录下正好有Main.class这个文件,所以java程序找到了它,然后执行,输出结果。

​ 希望你对以上结果有正确的理解,此外关于classpath还有很多有趣的情况,我不介绍了,我希望你熟悉了之后可以自己尝试,但现在不要,否则破坏了环境来问我就增加无谓的工作量。
以后我们可以将一些常用的库配置到classpath,比如配置mybatis: classpath=.; C:\Program Files\Mybatis,使得我们可以在任何目录都可以引用这些库,就像前面我们虽然在C:\Users\admin\Desktop目录下,却可以使用C:\Users\admin\Desktop\a目录下的class文件(其实使用IDE之后,这些都不用管,提出来供大家了解)

4 附件: Main.java

public class Main {    public static void main(String[] args) {        System.out.println("a/main");    }}