Java link lib/rt.jar 如何在运行时添加到您的应用程序?

How does Java link lib/rt.jar to your app at runtime?

Java standard/system 库(java.*javax.* 等)存储在每个 JRE 发行版中的 lib/rt.jar 中。

假设我有一个已编译的应用程序 jarred 到 myapp.jar。此 JAR 仅包含我的应用程序的 class 文件,仅包含 引用 系统 class 像 SystemFileRuntime, Thread, String, Boolean, 等等

因此,当我 运行 我的应用程序通过 java -jar myapp.jar 说时,JVM 显然是在最后一分钟执行链接(或其他),它正在执行我的 class 的字节码文件(在 myapp.jar 内),然后 "jumping" 到 lib/rt.jar 到位于那里的 运行 字节码。如果 myapp.jar 依赖于 运行 时间 classpath.

提供的其他 JAR,我想过程是相同的

我的问题是:这个 "linking" 进程叫什么,它基本上是如何工作的?

rt.jar 是 bootstrap class 路径的一部分,是您已知的通常 class 路径的父级,并且在您使用 -cp 选项(您实际上也可以使用 -Xbootclasspath 选项更改 bootstrap class 路径以加载,例如自定义 Java 运行时)。

请参阅 Oracle 文档以了解 detailed description classes 如何 searched/loaded 来自系统定义的 class 路径层次结构。

现在,您似乎还有其他问题:

  1. 档案实际上是如何找到的?

    它只是硬编码的。如果 java 二进制文件位于 <common_root>/bin/java,rt.jar 将在 <common_root>/lib/rt.jar 中搜索。

  2. "linking"是如何执行的?

    在 JVM 上没有实际链接,classes 是使用基于 ClassLoader 层次结构的机制动态加载的,这些是实际执行 class 文件的软件组件 loading/parsing。当您尝试加载 class 时,搜索从面向应用程序的默认 classloader(或子 classloader,如果您定义了一个)开始,如果 class 无法加载 加载尝试与父 classloader 重复,直到到达 bootstrap classloader。

    如果找到 class,则加载、解析 .class 文件,表示 class 的内部结构及其数据为 created.Once class 加载一个新的实例可以创建。 相反,如果启动 classloader 无法加载您的 class,则会抛出用户可见的 ClassNotFoundException