Java 为什么rt.jar不是类路径系统属性的一部分?

Java 为什么rt.jar不是类路径系统属性的一部分?,java,intellij-idea,gradle,classpath,rt.jar,Java,Intellij Idea,Gradle,Classpath,Rt.jar,我使用系统属性java.class.path查找属于该类路径的所有JAR和目录。起初,这似乎很有效。但仔细检查后,我发现当我用gradle执行程序时,这个类路径中没有rt.jar。从IntelliJ IDEA执行时,“rt.jar”是该类的一部分 为什么IntelliJ和Gradle之间的类路径有这样的不同 需要明确的是:rt.jar中包含的所有类都加载得很好,只是属性让我感到困惑。默认情况下,JVM中有三个类加载程序: 引导类加载程序-包括rt.jar 扩展类加载器-包括JAVA_HOME/j

我使用系统属性
java.class.path
查找属于该类路径的所有JAR和目录。起初,这似乎很有效。但仔细检查后,我发现当我用gradle执行程序时,这个类路径中没有
rt.jar
。从IntelliJ IDEA执行时,“rt.jar”是该类的一部分

为什么IntelliJ和Gradle之间的类路径有这样的不同


需要明确的是:
rt.jar
中包含的所有类都加载得很好,只是属性让我感到困惑。

默认情况下,JVM中有三个类加载程序:

  • 引导类加载程序-包括rt.jar
  • 扩展类加载器-包括JAVA_HOME/jre/lib/ext
  • 应用程序类加载器-java.class.path

  • 通过打印
    java.lang.ManagementFactory.getRuntimeMXBean().getBootClassPath()
    ,可以在引导类路径上看到rt.jar。我不熟悉IDEA,所以我不知道IDEA为什么在java.class.path中包含rt.jar,但我怀疑它是多余的,因为这些类无论如何都将由引导类加载程序加载。

    rt.jar不需要在类路径中,因为它已经在引导类路径中。 从类路径中删除它是安全的

    您可以参考此Oracle文档:

    Java启动器如何查找引导类 引导类是实现Java2平台的类。引导类位于rt.jar和jre/lib目录中的其他几个jar文件中。这些存档由存储在sun.boot.class.path系统属性中的引导类路径的值指定。此系统属性仅供参考,不应直接修改


    您不太可能需要重新定义引导类路径。非标准选项-Xbootclasspath允许您在需要使用不同核心类集的罕见循环中执行此操作。

    文件->项目结构->SDK
    (Mac上的IDEA)

    你会发现这个想法帮助你加载了你需要的类