为什么rt.jar不属于类路径系统属性?

时间:2014-05-19 06:21:03

标签: java intellij-idea gradle classpath rt.jar

我使用系统属性java.class.path来查找属于类路径的所有jar和目录。在第一个sigth,这似乎很好。但仔细观察后,我发现当我使用gradle执行程序时,此类路径中没有rt.jar。当从IntelliJ IDEA执行时,'rt.jar'是该类的一部分。

为什么IntelliJ和Gradle之间的类路径以这种方式不同?

要明确一点:rt.jar中包含的所有类都被加载得很好,这只是令我困惑的属性。

3 个答案:

答案 0 :(得分:4)

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

您可以参考此Oracle文档:http://docs.oracle.com/javase/8/docs/technotes/tools/findingclasses.html

Java Launcher如何查找Bootstrap类

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

您不太可能需要重新定义引导类路径。非标准选项-Xbootclasspath允许您在那些需要使用不同核心类的稀有cicrcumstance中这样做。

答案 1 :(得分:3)

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

  1. 引导类加载器 - 包括rt.jar
  2. 扩展类加载器 - 包括JAVA_HOME / jre / lib / ext
  3. 应用程序类加载器 - java.class.path
  4. 您可以通过打印java.lang.ManagementFactory.getRuntimeMXBean().getBootClassPath()在引导类路径上看到rt.jar。我不熟悉IDEA,所以我不知道为什么IDEA在java.class.path中包含rt.jar,但我怀疑它是多余的,因为无论如何这些类都将由引导类加载器加载。

答案 2 :(得分:0)

File -> Project Structure -> SDKs(Mac上的IDEA)

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