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
中。
假设我有一个已编译的应用程序 jar
red 到 myapp.jar
。此 JAR 仅包含我的应用程序的 class 文件,仅包含 引用 系统 class 像 System
、File
、Runtime
, 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 路径层次结构。
现在,您似乎还有其他问题:
档案实际上是如何找到的?
它只是硬编码的。如果 java
二进制文件位于 <common_root>/bin/java
,rt.jar 将在 <common_root>/lib/rt.jar
中搜索。
"linking"是如何执行的?
在 JVM 上没有实际链接,classes 是使用基于 ClassLoader 层次结构的机制动态加载的,这些是实际执行 class 文件的软件组件 loading/parsing。当您尝试加载 class 时,搜索从面向应用程序的默认 classloader(或子 classloader,如果您定义了一个)开始,如果 class 无法加载 加载尝试与父 classloader 重复,直到到达 bootstrap classloader。
如果找到 class,则加载、解析 .class
文件,表示 class 的内部结构及其数据为 created.Once class 加载一个新的实例可以创建。
相反,如果启动 classloader 无法加载您的 class,则会抛出用户可见的 ClassNotFoundException
。
Java standard/system 库(java.*
、javax.*
等)存储在每个 JRE 发行版中的 lib/rt.jar
中。
假设我有一个已编译的应用程序 jar
red 到 myapp.jar
。此 JAR 仅包含我的应用程序的 class 文件,仅包含 引用 系统 class 像 System
、File
、Runtime
, Thread
, String
, Boolean
, 等等
因此,当我 运行 我的应用程序通过 java -jar myapp.jar
说时,JVM 显然是在最后一分钟执行链接(或其他),它正在执行我的 class 的字节码文件(在 myapp.jar
内),然后 "jumping" 到 lib/rt.jar
到位于那里的 运行 字节码。如果 myapp.jar
依赖于 运行 时间 classpath
.
我的问题是:这个 "linking" 进程叫什么,它基本上是如何工作的?
rt.jar
是 bootstrap class 路径的一部分,是您已知的通常 class 路径的父级,并且在您使用 -cp
选项(您实际上也可以使用 -Xbootclasspath
选项更改 bootstrap class 路径以加载,例如自定义 Java 运行时)。
请参阅 Oracle 文档以了解 detailed description classes 如何 searched/loaded 来自系统定义的 class 路径层次结构。
现在,您似乎还有其他问题:
档案实际上是如何找到的?
它只是硬编码的。如果
java
二进制文件位于<common_root>/bin/java
,rt.jar 将在<common_root>/lib/rt.jar
中搜索。"linking"是如何执行的?
在 JVM 上没有实际链接,classes 是使用基于 ClassLoader 层次结构的机制动态加载的,这些是实际执行 class 文件的软件组件 loading/parsing。当您尝试加载 class 时,搜索从面向应用程序的默认 classloader(或子 classloader,如果您定义了一个)开始,如果 class 无法加载 加载尝试与父 classloader 重复,直到到达 bootstrap classloader。
如果找到 class,则加载、解析
.class
文件,表示 class 的内部结构及其数据为 created.Once class 加载一个新的实例可以创建。 相反,如果启动 classloader 无法加载您的 class,则会抛出用户可见的ClassNotFoundException
。