【问题标题】:Why is rt.jar not part of the class path system property?为什么 rt.jar 不是类路径系统属性的一部分?
【发布时间】:2014-07-07 00:12:12
【问题描述】:

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

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

明确一点:rt.jar 中包含的所有类都可以正常加载,只是属性让我感到困惑。

【问题讨论】:

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


    【解决方案1】:

    默认情况下,JVM中有3个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.path 中包含 rt.jar,但我怀疑这是多余的,因为无论如何这些类都将由引导类加载器加载。

    【讨论】:

      【解决方案2】:

      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 允许您在需要使用不同核心类集的罕见情况下这样做。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-20
          • 1970-01-01
          • 2016-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多