jdk是每一个使用java的人员每一天都在使用的东西,博主也已经研究了jdk源代码中的一些类了,本篇博客是想从jdk包结构的角度去拆分jdk的源代码包,以提供从设计角度的一个理解。

本篇博客基于jdk1.8

jdk包总览

jdk的包如下图所示:

该图是直接从jdk的包目录截取出来的图,我们常常打交道的java源代码都位于rt.jar这个包下面, 对java有一定使用经验的读者应该对此包都有印象。我们想着重分析的包也是rt.jar这个包。

在此之前,其他这么多的jar包是拿来干什么的呢?它们各自发挥的作用大致如下:

access-bridge-64.jar

Java Accessibility API是Java Accessibility Utilities的一部分,它是一组实用程序类,可帮助辅助技术提供对实现Java Accessibility API的GUI工具包的访问。

charsets.jar

Java 字符集,包含 Java 所有支持字符的字符集

cldrdata.jar

Unicode CLDR为软件提供了支持世界语言的关键构建块,提供了最大和最广泛的语言环境数据库。 这些数据被广泛的公司用于其软件国际化和本地化,使软件适应不同语言的惯例以用于此类常见软件任务.

deploy.jar

Java安装目录的常见部分 - 该文件运行某些产品的安装。 正确设置Java路径后,用户可以执行此文件(只需双击它或按文件上的Enter键),要部署的应用程序将运行其安装程序。 例如。 诺基亚OVI套件通常使用这种部署形式。 作为彼此的JAVA包,如果您将其重命名为ZIP并打开内容,则可以检查包中的类。

dnsns.jar

即DNS naming service ,提供DNS地址服务的包,里面只有2个方法 getHostByAddr和 lookupAllHostAddr

jaccess.jar

定义Assistive Technologies.AWT(Abstract Window Toolkit)使用的JDK实用程序类

javaws.jar

JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径。

jce.jar

java类库是java发布之初就确定了的基础库, 而javax类库则是在上面增加的一层东西,就是为了保持版本兼容要保存原来的,但有些东西有了更好的解决方案, 所以,就加上些,典型的就是awt(Abstract Windowing ToolKit) 和swing。) 这个包都是加密相关的。

jfr.jar

和 jdk\bin\jmc.exe有关系。Java Mission Control 包括 JMX 控制台和 Java 飞行记录器。 Java 飞行记录器 (JFR) 是一个用于收集有关正在运行的 Java 应用程序的诊断数据和概要分析数据的工具。它集成到 Java 虚拟机 (JVM) 中, 几乎不会带来性能开销,因此甚至可以在高负载生产环境中使用。使用默认设置时,内部测试和客户反馈表明性能影响低于 1%。 对于一些应用程序,这一数字会大幅降低。但是,对于短时间运行的应用程序 (不是在生产环境中运行的应用程序类型), 相对的启动和预热时间可能会较长,这对性能的影响可能会超过 1%。JFR 收集有关 JVM 及其上运行的 Java 应用程序的数据。

jfxrt.jar

JDK有个 rt.jar ,是存储JAVA语言核心类的的。这个jfxrt.jar就相当于JavaFX的rt.jar. JavaFX是一组图形和媒体包,使开发人员能够设计,创建,测试,调试和部署在不同平台上一致运行的富客户端应用程序。在jdk最新的发版当中,javafx的包已经被移除了。

jfxswt.jar

也是和JavaFx相关,为JavaFx和Swing提供一些兼容性操作。

jsse.jar

SSL连接,验证的包,

localedata.jar

日期显示国际化的包,里面包含各地区的日期文字。

management-agent.jar

里面只有一个文本文件。

nashorn.jar

1.动态链接.包含用于链接调用的动态调用站点的接口和类。 dynalink与java.lang.invoke包密切相关,并且依赖于该包。 虽然java.lang.invoke为invoke dynamic调用站点的动态链接提供了一个低级别的API,但它不提供一种方法来表示对象的更高级别操作,也不提供实现这些操作的方法。 如果一种语言是静态类型的,并且它的类型系统与JVM的类型系统匹配,那么它可以使用通常的调用、字段访问等指令(例如invokevirtual、getfield)来实现这一点。 但是,如果语言是动态的(因此,某些表达式的类型直到在运行时进行计算时才知道),或者其对象模型或类型系统与JVM的对象模型或类型系统不匹配, 那么它应该使用invokedynamic调用站点,并让dynalink管理它们。

2.Javascript引擎 从 JDK 8 开始,Nashorn取代 Rhino 成为 Java 的嵌入式 JavaScript 引擎。Nashorn 完全支持ECMAScript 5.1 规范以及一些扩展。该特性允许开发人员将 JavaScript 代码嵌入到 Java 中,甚至从嵌入的 JavaScript 中调用 Java。此外, 它还提供了使用jrunscript从命令行运行 JavaScript 的能力。

plugin.jar

功能很庞大的一个包。

resources.jar

提示信息显示国际化的包,里面各地区的文字,图片等。

rt.jar

java核心源代码包

sunec.jar ,sunjce_provider.jar,sunmscapi.jar,sunpkcs11.jar

都是加密相关的包。

zipfs.jar

java 对zip文件操作的支持。

rt.jar包结构分析

rt.jar包含核心Java Runtime环境的所有已编译类文件。rt.jar包的总体结构如下图所示

当我们在装好java环境之后,有一些类我们就是可以直接使用的,例如List,原因在于java的类加载机制已经将这些最基本的类即jdk核心代码加载好了。负责这一事情的类加载器就是Boot Strap ClassLoader,它唯一做的事情就是负责从bootstrap  classpath加载类,并且只加载rt.jar。 并且该加载具有最高优先级。其中最为核心的也是我们最常使用的类位于java这个包下面,如下:

applet负责网络应用程序部分,awt负责ui部分的支持。beans

io包负责输入输出流的支持,lang下面则包含了非常多的东西,包括反射,注解等。

math包包含了一些科学计算方面的类如BigDecimal等

net包含了支持网络编程的类如Socket等等

nio即新io也是输入输出的支持,包含Channel管道通信等技术

rmi包含了对远程服务调用支持的类

security包含安全,权限控制相关的类

sql包含了数据库相关技术的类例如Driver,DriverManager等类

text包含了文本内容相关支持的类

time包含日期相关的类如Date,Calendar,Month等等

util是一个非常大的包,下面包含的东西非常多,包括并发支持,正则表达式,日志,容器等非常重要的类。

Table of Contents概述jdk包总览rt.jar包结构分析概述jdk是每一个使用java的人员每一天都在使用的东西,博主也已经研究了jdk源代码中的一些类了,本篇博客是想从jdk包结构的角度去拆分jdk的源代码包,以提供从设计角度的一个理解。本篇博客基于jdk1.8jdk包总览jdk的包如下图所示:该图是直接从jdk的包目录截取出来的图,我们常...
jdk 8目录下的源码没有rt. jar 中的一些 ,例如sun 。 在https://download.java.net/open jdk / jdk 8/目录下有相关的下载,但是下载太慢(已经下载不到) 这个 不全,暂时关闭
open jdk 安装 曾经尝试在Java和Open JDK 中使用椭圆曲线密码术(ECC)的每个人要么被迫使用Bouncy Castle,要么被SunEC提供者 弄糊涂了。 SunEC提供程序根据 文档(报价)提供以下算法: AlgorithmParameters KeyAgreement KeyFactory KeyPairGenera...
System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响,得到的结果是时间戳格式的。例如: 1543105352845 我们可以将时间戳转化成我们易于理解的格式 SimpleDateFormat formatter= new S...
在使用Jenkins进行项目打 时,可以根据项目的需求选择使用不同版本的 JDK 进行打 。下面是使用 JDK 8对 JDK 11 进行打 的步骤: 1. 首先,确保已经下载并安装了 JDK 8和 JDK 11 。 2. 在Jenkins的工作目录下,将 JDK 8的压缩 解压到一个合适的位置。 3. 在Jenkins的页面中,找到项目的配置页面。 4. 在配置页面中,找到构建环境或构建步骤的相关设置。 5. 在构建环境或构建步骤中,找到设置 JDK 的选项。 6. 选择 JDK 8的路径,将其配置为Jenkins使用的 JDK 版本。 7. 保存配置并触发项目的构建。 通过以上步骤,Jenkins将会使用 JDK 8来进行项目的打 ,从而实现了使用 JDK 8对 JDK 11 进行打 的需求。