How does rt.jar works?
转载自: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:
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
.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-visibleClassNotFoundException
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文件,我鼓励你自己去看看。
How does rt.jar works?的更多相关文章
- 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一年有余,却总是被两则不起眼的编译信息困扰,终想查明 ...
- JRE下的rt.jar、tools.jar
JRE下的rt.jar: 这个文件是极为重要的一个文件,rt是runtime的缩写,即运行时的意思.是java程序在运行时必不可少的文件. 里面包含了java程序员常用的包,如java.lang,ja ...
- Eclipse选择rt.jar的源代码的位置
1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES" 2. ...
- 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重新加入. ===== ...
- 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 编译时 ...
- 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 ...
- rt.jar sun package
安装完JDK后,会在%JAVA_HOME% /jdk文件夹下生成一个src.zip,此文件夹对应rt.jar中的java源码,但细心研究后发现rt.jar中sun包下的文件不存在,也就是说 ...
- 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 ...
- 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 ...
随机推荐
- php 两个数组,若键相同,则值合并
<?php $arr1 = array('9' => '4.08', '10' => '0.10', '11' => '4.08', '12' => '0.01'); $ ...
- 修改CentOS6.5默认主机名(root下操作)
使用CentOS6.5官方镜像安装完毕之后,默认的主机名为localhost,不便管理,我们需要根据实际情况修改. 此处我准备讲默认的主机名 localhost 改为 comex01-ct65 第一步 ...
- CF1152E Neko and Flashback--欧拉路径
RemoteJudge 第一次见到欧拉路径的题 注意到\(b\)和\(c\)的构造方法很特殊,即对于一个位置(经过\(p\)作用后)\(i\),若两个数分别为\(b_i\)和\(c_i\),那么在\( ...
- CF451E Devu and Flowers
多重集求组合数,注意到\(n = 20\)所以可以用\(2 ^ n * n\)的容斥来写. 如果没有限制那么答案就是\(C(n + s - 1, n - 1)\).对每一个限制依次考虑,加上有一种选多 ...
- Python语言的循环语句、迭代器与生成器、函数学习
while循环语句 无限循环 我们可以通过设置条件表达式永远不为false来实现无限循环,实例如下: for语句 Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串 Python ...
- Python 中使用 matplotlib 绘图中文字符显示异常的问题
最近在使用 Python matplotlib 绘制图表时发现中文字符不能正确显示:比如在绘制折线图时,中文全部显示成▢▢▢的格式,虽然将数据改成英文就没什么问题,但是所有数据都这么做时不可行的,于是 ...
- docker 容器网络基础
======================== docker缺省自带的网络 ======================== host 网络, This enables a container to ...
- 使用百度云 BOS 和 C# SDK 开发数据存储
Ø 简介 本文主要介绍如何使用百度云的 C# SDK 操作 BOS(Baidu Object Storage/百度对象存储),以及常见问题和解决办法.本文将以以下几点展开学习: 1. 基本介绍 ...
- bzoj 4244 括号序列dp
将各种情况绕环等看作括号序列,括号内的区域上下都需要累加答案,左右也是 f[i][j] 代表 前i个车站已经处理完的有j个左括号的最小权值 我们可以发现,更新的来源来自于 i-1, 和 i 将上 描述 ...
- #0 scrapy爬虫学习中遇到的坑记录
python 基础学习中对于scrapy的使用遇到了一些问题. 首先进行的是对Amazon.cn的检索结果页进行爬取,很顺利,无碍. 下一个目标是对baidu的搜索结果进行爬取 1,反爬虫 1.1 我 ...