Java如何在运行时将lib / rt.jar链接到您的应用程序?

时间:2015-05-13 18:33:48

标签: java linker jvm classloader

Java标准/系统库(java.*javax.*等)存储在每个JRE发行版的lib/rt.jar内。

假设我有一个已编译的应用程序,jar红色进入myapp.jar。此JAR仅包含我的应用程序的类文件,仅包含引用系统类,如SystemFileRuntimeThread,{{1} },String

因此,当我运行我的应用程序时,通过Boolean说,JVM显然是在最后一刻链接(或其他)执行我的类文件的字节码(在java -jar myapp.jar内)并且然后“跳转”到myapp.jar以运行位于那里的字节码。如果lib/rt.jar依赖于运行时myapp.jar上提供的其他JAR,我认为该过程是相同的。

我的问题是:这个“链接”过程叫什么,它本质上是如何工作的?

1 个答案:

答案 0 :(得分:1)

rt.jar是引导类路径的一部分,它是您已经知道的常用类路径的父级,并且在使用-cp选项时进行配置(您实际上也可以使用以下命令更改引导类路径) -Xbootclasspath选项,用于加载(例如,自定义Java运行时)。

有关如何从系统定义的类路径层次结构中搜索/加载类的detailed description,请参阅Oracle文档。

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

  1. 存档如何找到

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

  2. “链接”是如何执行的?

    在JVM上没有实际链接,使用基于ClassLoader层次结构的机制动态加载类,ClassLoader是实际执行类文件加载/解析的软件组件。当您尝试加载类时,搜索从面向应用程序的默认类加载器(或者如果已定义了一个子类加载器)开始,如果无法加载该类,则使用父类加载器重复加载尝试,直到引导类加载器为到达。

    如果找到了类,则会加载,解析.class文件,并创建表示类及其数据的内部结构。一旦加载了类,就可以创建一个新实例。 相反,即使引导类加载器无法加载您的类,也会引发用户可见的ClassNotFoundException