关于classpath
刚学Java那会儿,配置Java开发环境,网上查找的教程都会教你如何配置JAVA_HOME
以及CLASSPATH
环境变量。
然而,CLASSPATH
其实是无需配置的。
Java程序使用到的类文件可以分为三类:
- 启动类(Bootstrap classes):组成Java平台的类,包括
rt.jar
以及其他一些重要jar文件; - 扩展类(Extension classes):
${JAVA_HOME}/jre/lib/ext
下面的jar包; - 用户类(User classes):开发者自己编写的类。
对应这三类class文件,Java中有三种类加载器:
- 启动类加载器
- 扩展类加载器
- 应用程序类加载器
一般而言,对于启动类和扩展类我们无需做任何配置,JVM会自动地找到这些类。
当然,对于启动类,也可以使用java -Xbootclasspath:<path>
来自行自定加载的路径,不过我们几乎不会这样做。
对于用户自定义的类:
- 如果不做任何配置,默认会从
.
路径,也就是当前路径下查找; - 如果使用形如
java -classpath "a/b/lib;c/xx.jar"
的参数,则会从指定的路径或jar包下查找,注意会覆盖掉.
路径; - 当然,如果设置了
CLASSPATH
也会从其设定值对应路径下查找。
使用CLASSPATH
来设置用户类的查找路径是不推荐的做法,因为这会污染系统环境变量,不同的Java程序查找到相同的用户类,而通常不同程序定义的类应该相互隔离。
最后,如果想要查看当前Java程序所使用的到的类路径,可以命令行输入jinfo <pid>
,找到java.class.path
对应的项;
sun.boot.class.path
则会列出启动类路径。
下面是一个查看示例:
-------------------------------------
吾生也有涯,而知也无涯。
吾生也有涯,而知也无涯。