我使用系统属性java.class.path
来查找属于类路径的所有 jar 和目录。乍一看,这似乎很好用。但是经过仔细检查,我发现当我使用 gradle 执行我的程序时rt.jar
,这个类路径中没有。从 IntelliJ IDEA 执行时,“rt.jar”是该类的一部分。
为什么 IntelliJ 和 Gradle 之间的类路径会以这种方式不同?
需要明确的是:所有包含在rt.jar
加载中的类都很好,只是让我感到困惑的属性。
我使用系统属性java.class.path
来查找属于类路径的所有 jar 和目录。乍一看,这似乎很好用。但是经过仔细检查,我发现当我使用 gradle 执行我的程序时rt.jar
,这个类路径中没有。从 IntelliJ IDEA 执行时,“rt.jar”是该类的一部分。
为什么 IntelliJ 和 Gradle 之间的类路径会以这种方式不同?
需要明确的是:所有包含在rt.jar
加载中的类都很好,只是让我感到困惑的属性。
rt.jar 不需要在类路径中,因为它已经在引导类路径中。从类路径中删除它是安全的。
您可以参考这个 Oracle 文档:http ://docs.oracle.com/javase/8/docs/technotes/tools/findingclasses.html
Java 启动器如何查找引导类
引导类是实现 Java 2 平台的类。引导类位于 rt.jar 和 jre/lib 目录中的其他几个 jar 文件中。这些存档由存储在 sun.boot.class.path 系统属性中的引导类路径的值指定。此系统属性仅供参考,请勿直接修改。
您不太可能需要重新定义引导类路径。非标准选项 -Xbootclasspath 允许您在需要使用不同核心类集的罕见情况下这样做。
默认情况下,JVM 中有三个 ClassLoader:
您可以通过打印在引导类路径上看到 rt.jar java.lang.ManagementFactory.getRuntimeMXBean().getBootClassPath()
。我不熟悉 IDEA,所以我不知道为什么 IDEA 在 java.class.path 中包含 rt.jar,但我怀疑这是多余的,因为无论如何这些类都将由引导类加载器加载。
File -> Project Structure -> SDKs
(Mac 上的想法)
您将看到 IDEA 已帮助您加载所需的类。