转载自:https://stackoverflow.com/questions/30222702/how-does-java-link-lib-rt-jar-to-your-app-at-runtime

That rt.jar is part of the bootstrap classpath, a parent of the usual classpath you already know and that you configure when you use the -cp option (you can actually change the bootstrap classpath too using the -Xbootclasspath option to load, for example, a custom Java runtime).

See Oracle documentation for a detailed description of how classes are searched/loaded from the system defined classpaths hierarchy.

Now, the additional questions you seemed to have:

  1. How is the archive actually found?

    It's simply hardcoded. If the java binary is located in <common_root>/bin/java, rt.jar will be searched in <common_root>/lib/rt.jar.

  2. How is the "linking" performed?

    On the JVM there is no actual linking, the classes are dynamically loaded using a mechanism based on a hierarchy of ClassLoader that are the software components that actually do the class file loading/parsing. When you try to load a class, the search starts from the application-facing default classloader(or a child classloader if you have defined one) and if the class cannot be loaded the loading attempt is repeated with a parent classloader until the bootstrap classloader is reached.

    If the class is found, the .class file is loaded, parsed and internal structures representing the class and its data are created.Once the class is loaded a new instance can be created. If instead, even the boot classloader could not load your class a user-visible ClassNotFoundException is thrown.

1)的rt.jar代表运行,并包含所有的核心Java运行时环境编译的类文件。

2)您必须在类路径中包含rt.jar,否则您无法访问核心类,例如java.lang.String,java.lang.Thread,java.util.ArrayList或java.io.InputStream以及Java API中的所有其他类。您可以通过使用WinRAR或WinZip客户端打开它,实际上可以看到rt.jar中的内容。您可以看到它不仅包含所有Java API,而且还包含com包中指定的内部类。

3)在windows中,rt.jar将始终位于$ JAVA_HOME/jre/lib下,其中$ JAVA_HOME指向JDK安装目录。即使你不安装JDK并只安装JRE,你也会看到它在完全相同的位置,你不会在$ JAVA_HOME/lib目录中找到rt.jar。顺便说一下,在MacOSX上,它被称为classes.jar,位于/ System/Library/Frameworks // Classes目录下。在以下截图中,您可以看到rt.jar位于Windows 8中的JRE lib目录中。

4)rt.jar是所有Java程序包驻留的位置。例如,如果一个类文件需要引用java.util.concurrent包中的一个类,例如ConcurrentHashMap,则JVM将在rt.jar中查找它,从而使其能够正确运行。

5)Java程序员问的另外一个问题是,我在哪里可以找到包含在rt.jar中的类的源代码?好吧,如果你已经安装了JDK,而不是JRE,那么你可以在$ JAVA_HOME/src.zip文件中找到所有的源代码。顺便说一句,sun。*源也包含在src.zip中,但这是专有的闭源Oracle代码。我还建议你将这个JAR文件包含在你的Eclipse中,这样你只需要输入Ctrl + T和类的名字就可以查看任何JDK类的源代码,其余部分将被Eclipse的Java类型搜索功能所关注。

6)了解rt.jar最重要的一件事就是JAR文件中的所有类都为JVM所知,这意味着JVM不会执行从加载其他JAR时执行的所有检查任何其他地点。这是由于各种性能原因而完成的,这就是为什么这些类由自举或原始类加载器加载的原因。不要试图将你的类文件包含在rt.jar中,因为它不提供Java的建议。它也与任何安全性妥协。

7)如果您对Java平台使用的不同二进制和JAR文件感兴趣,请查看此图。你可以看到JDK有三个主文件夹bin,lib和jre。 bin目录包含所有二进制可执java.exe运行Java程序,javac.exe编译Java程序等。lib包含tools.jar和dt.jar。 jre文件夹再次包含bin和lib目录。它位于这个lib目录中的rt.jar驻留。顺便说一下,这些文件和文件夹都做了什么,请查看Oracle官方网页。它们非常全面和描述性。

这是所有关于Java中的rt.jar文件。现在你知道rt.jar的目的是什么,为什么你不应该搞砸它。你可以在$ JAVA_HOME/jre/lib目录下找到这个JAR文件,我鼓励你自己去看看。

了解更多:http://javarevisited.blogspot.com/2015/01/what-is-rtjar-in-javajdkjre-why-its-important.html#ixzz3xkhLYtjP

 

How does rt.jar works?的更多相关文章

  1. Workspace defines a VM that does not contain a valid jre/lib/rt.jar: C:\Program Files\Java\jre7

    Maven编译时两则信息 (Workspace以及default classpath container) 博客分类: Java   使用Maven一年有余,却总是被两则不起眼的编译信息困扰,终想查明 ...

  2. JRE下的rt.jar、tools.jar

    JRE下的rt.jar: 这个文件是极为重要的一个文件,rt是runtime的缩写,即运行时的意思.是java程序在运行时必不可少的文件. 里面包含了java程序员常用的包,如java.lang,ja ...

  3. Eclipse选择rt.jar的源代码的位置

    1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...

  4. Access restriction:The type JPEGCodec is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar

    解决方法: Project -> Properties -> libraries, 先remove掉JRE System Library,然后再Add Library重新加入. ===== ...

  5. Eclipse报错 due to restriction on required library C:/Java/jdk1.7.51/jre/lib/rt.jar 解决方案

    Eclipse报错 due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决方案 Eclipse 编译时 ...

  6. Jmeter读取Excel,BeanShell取样器调用rt.jar和jxl.jar

    将rt.jar和jxl.jar,放在\apache-jmeter-5.0\lib\ext下面 import java.io.*; import java.util.ArrayList; import ...

  7. rt.jar sun package

          安装完JDK后,会在%JAVA_HOME% /jdk文件夹下生成一个src.zip,此文件夹对应rt.jar中的java源码,但细心研究后发现rt.jar中sun包下的文件不存在,也就是说 ...

  8. Java,AWTUtilities,eclipse报编译错误:Access restriction: The type 'AWTUtilities' is not API (restriction on required library 'C:\Program Files\Java\jre7\lib\rt.jar')

    [场景]调用com.sun.awt.AWTUtilities时,eclipse提示编译错误: Access restriction: The type 'AWTUtilities' is not AP ...

  9. java.io.IOException: Can't read [\jre\lib\rt.jar]

    [proguard] java.io.IOException: Can't read [F:\e\java\jdk1.8.0_101\jre\lib\rt.jar] (Can't process cl ...

随机推荐

  1. Mysql高性能笔记(一):Schema与数据类型优化

    1.数据类型 1.1.几个参考优化原则 a.  更小的通常更好 i.更小的数据类型,占用更少磁盘.内存和CPU缓存,需要的CPU周期更少 ii.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最 ...

  2. css:a:visited限制

    :active 对于:active伪类可以在div上生效.没有限制 :visited使用限制 :visited只适用于带href的a标签.如果给a标签绑定了click事件,那跳转的url必须跟href ...

  3. Mysql 查询当月时间数据

    SELECTDATE_FORMAT(CURDATE(), '%Y%m'), DATE_FORMAT(t.transactiontime, '%Y%m'),t.*FROM ttransactions t ...

  4. (模拟) codeVs1160 蛇形矩阵

    题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该 ...

  5. python全栈开发中级班全程笔记(第二模块)第 二 部分:函数基础(重点)

    python学习笔记第二模块         第二部分    :    函数(重点) 一.函数的作用.定义 以及语法 1.函数的作用 2.函数的语法和定义 函数:来源于数学,但是在编程中,函数这个概念 ...

  6. Linux(Centos)设置ip

    一.Linux(Centos7)安装完毕后,重启电脑后,输入用户名(root),密码(**********). 在命令行中输入nmtui命令.选择Edit a connection,选择对应的链接端口 ...

  7. [面试]Actor模型

    Actor模型 面试中自己说话不利落, 或者自己对知识点认识不全面.在这里进行一下记录. 理论部分都是收集(copy)自网上其他的博客. 什么是Actor模型 参与者模式(英语:Actor model ...

  8. 模仿OpenStack写自己的RPC

    在openstack中使用两种通信方式,一种是Restful API,另一种是远程过程调用RPC.本片文章主要讲解openstack中RPC的使用方式,以及如何在我们自己的架构中使用RPC. 在我前面 ...

  9. 第十二节:WebApi自动生成在线Api文档的两种方式

    一. WebApi自带生成api文档 1. 说明 通过观察,发现WebApi项目中Area文件夹下有一个HelpPage文件夹,如下图,该文件夹就是WebApi自带的生成Api的方式,如果该文件夹没了 ...

  10. mysqldump 备份数据和恢复

    命令行下具体用法如下:  mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 一.导出数据: 导出整个数据库结构和数据mysqldump -h localhost -u ...