4

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

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

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

4

3 回答 3

4

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

于 2014-05-19T06:29:22.773 回答
3

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

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

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

于 2014-05-19T06:25:35.250 回答
0

File -> Project Structure -> SDKs(Mac 上的想法)

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

于 2017-03-02T06:39:08.663 回答