关于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则会列出启动类路径。

下面是一个查看示例:

-------------------------------------
吾生也有涯,而知也无涯。
原文地址:https://www.cnblogs.com/SanjiApollo/p/12836423.html