为什么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 Launcher如何查找Bootstrap类

引导类是实现Java 2平台的类。引导类位于jre/lib目录下的rt.jar和其他几个jar文件中。这些归档文件由bootstrap类路径的值指定,该路径存储在sun.boot.class.path系统属性中。此系统属性仅供参考,请勿直接修改。

不太可能需要重新定义引导类路径。非标准选项-Xbootclasspath允许您在需要使用另一组核心类的罕见情况下这样做。

默认情况下,JVM中有三个ClassLoader:

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

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

File -> Project Structure -> SDKs (IDEA on Mac)

您将看到IDEA已经帮助您加载了所需的类。

最新更新