最近发现,在idea中查看util包的源码时,发现几乎所有的Core APIs,都位于rt.jar这个路径下,例如util包,lang包等,csdn上几乎都找不到rt.jar相关的介绍,因此google了下,找到了一篇相关的文章,以此记录,分享一下,翻译有调整,末尾附英文原版。

Java / JDK / JRE中的rt.jar是什么? 为什么重要?

rt.jar代表runtime JAR,并且包含引导类(bootstrap classes)——来自Core Java API的所有类。很多Java开发都不知道什么是rt.jar?经常混淆rt.jar文件的作用,或疑惑在Java中为什么使用rt.jar文件?

Windows和Linux中,rt.jar位于JRE的lib目录下。JDK 1.7之前,MacOSX中叫classes.jar,从Java 7开始也改为rt.jar。很多开发尝试把自己的类放进rt.jar中,来解决与类路径相关的问题,但最好不要这样做,因为rt.jar包含了JVM信任的class文件,JVM加载时不会对其他class文件进行严格的安全检查。

在本文中,我们将讨论与rt.jar相关的内容。对刚接触Java而且不熟悉JAR文件的开发来说,rt.jar是一个类似zip的压缩文件,精确称为“Java archive”(Jar),存储了Java class文件和程序所需的全部资源。它还可以包含mainfest文件,还可以包含Main-Class条目,变成可执行JAR,使用java -jar命令来运行。

  1. rt.jar代表runtime,包含所有核心Java 运行环境的已编译calss文件。
  2. 必须在类路径中包含rt.jar,否则您无权访问核心类,例如 java.lang.String,java.lang.Thread,java.util.ArrayList或java.io.InputStream等,以及所有Java API中的其他类。 可以使用IDE打开并查看rt.jar中的内容, 它不仅包含所有Java API,还包含com包中指定的内部类。
  3. 在windows中,rt.jar位于$ JAVA_HOME / jre / lib下。 即使没有安装JDK并且只安装JRE,也会在完全相同的位置看到它,在$ JAVA_HOME / lib目录中找不到rt.jar。 顺便提一句,在MacOSX上,它被称为classes.jarand,位于/ System / Library / Frameworks // Classes目录下。 下面的截图中,可以看到rt.jar位于Windows 中JRE的lib目录中。
  4. rt.jar是所有Java包所在的位置。例如,需要从java.util.concurrentpackage引用类,比如 ConcurrentHashMap,JVM会从rt.jar中查找它,从而使程序能够正确运行。
  5. 另一个Java开发常问的问题,在哪里可以找到rt.jar中包含的类的源码呢?安装了JDK的可以在$ JAVA_HOME / src.zip文件中找到所有源码。BTW,sun.* 源码也包含在src.zip中,但这是专有的闭源Oracle代码。 建议在Eclipse中添加这个JAR文件,只需键入Ctrl + T和类名就可以查看任何JDK类的源码,其余部分将由Eclipse的Java类型搜索功能处理。
  6. 关于rt.jar一个很重要的事就是,JVM知道这个JAR文件中的所有类,这意味着JVM在从任何位置加载时都不会执行检查。 之所以这样做是由于各种性能原因,这就是为什么这些class由bootstrap或primodial类加载器加载的原因。 所以最好不要尝试将自己类文件包含在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目录。 rt.jar就在这里的lib目录中。 BTW,如果想全面理解每个文件和文件夹的功能,请查看Oracle官方介绍,非常全面和具体。

以上就是关于rt.jar文件的全部内容。 现在知道rt.jar的目的是什么,以及为什么你不应该惹它了吧。 你还可以在$ JAVA_HOME / jre / lib目录中找到JAR文件,建议亲自看下。