-
2021-06-24 10:38:59更多相关内容
-
JDK源码包.zip
2020-03-11 19:20:24解决在eclipse,myeclipse,idea等开发工具中追源码时遇到追不到的情况,因为本身JDK里面的源码文件只有20MB远远不完整,内含Java源码包,使用方法等,希望能够帮助到更多的喜欢看源码的技术朋友。 -
写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实
2020-07-16 09:22:59不过话说回来,对于这个天天使用的东西,我们难道不好奇这玩意儿它到底是怎么由源码编译出来的吗? 带着这个原始的疑问,今天准备大干一场,自己动动呆萌的小手,来编译一个属于自己的JDK吧! 对了,本文在开源项目...
好奇害死羊
很多小伙伴们做
Java
开发,天天写Java
代码,肯定离不开Java
基础环境:JDK
,毕竟我们写好的Java
代码也是跑在JVM
虚拟机上。一般来说,我们学
Java
之前,第一步就是安装JDK
环境。这个简单啊,我们一般直接把JDK
从官网下载下来,安装完成,配个环境变量就可以愉快地使用了。不过话说回来,对于这个天天使用的东西,我们难道不好奇这玩意儿它到底是怎么由源码编译出来的吗?
带着这个原始的疑问,今天准备大干一场,自己动动呆萌的小手,来编译一个属于自己的
JDK
吧!对了,本文在开源项目:https://github.com/hansonwang99/JavaCollection 中已收录,包含自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
还有个待填的坑
记得之前不是出过一期关于《JDK源码阅读环境搭建》相关的视频以及文章嘛,细心的小伙伴,可能会发现一个很实际的问题:
我们将
src.zip
包里的JDK
源码解压出来,关联到这份源码之后,调试时是可以进,但是我们在加注释的时候却只能在行尾添加,并不能改变原代码的行结构。换句话说,如果在源码中加了跨行的多行注释,则debug
调试的时候就会出现当前行的运行错位问题,这个有点尴尬了。当然那个视频的评论区,的确也有几个小伙伴提了这个问题:
原因也很简单,因为实际支撑调试运行的代码,并不是我们解压出来的那份
JDK
源码,那个仅仅是做关联用,实际运行用到的JDK
,还是之前系统安装好的那个JDK
环境。要想解决这个问题,那就只能使用自己修改过的代码来自行编译生成自己的
JDK
,然后用到项目中去!所以什么都憋说了,肝就完了!
环境准备
首选说在前面的是,编译前的软件版本关系极其重要,自己在踩坑时,所出现的各种奇奇怪怪的问题几乎都和这个有关,后来版本匹配之后,就非常顺利了。
我们来盘点和梳理一下编译一个JDK需要哪些环境和工具:
1、boot JDK
我们要想编译
JDK
,首先自己本机必须提前已经安装有一个JDK
,官方称之为bootstrap JDK
(或者称为boot JDK
)。比如想编译
JDK 8
,那本机必须最起码得有一个JDK 7
或者更新一点的版本;你想编译JDK 11
,那就要求本机必须装有JDK 10
或者11
。所以鸡生蛋、蛋生鸡又来了…
2、Unix环境
编译
JDK
需要Unix
环境的支持!这一点在
Linux
操作系统和macOS
操作系统上已经天然的保证了,而对于Windows
兄弟来说稍微麻烦一点,需要通过使用Cygwin
或者MinGW/MSYS
这种软件来模拟。就像官方所说:在
Linux
平台编译JDK
一般问题最少,容易成功;macOS
次之;Windows
上则需要稍微多花点精力,问题可能也多一些。究其本质原因,还是因为
Windows
毕竟不是一个Unix-Like
内核的系统,毕竟很多软件的原始编译都离不开Unix Toolkit
,所以相对肯定要麻烦一些。3、编译器/编译工具链
JDK
底层源码(尤其JVM
虚拟机部分)很多都是C++/C
写的,所以相关编译器也跑不掉。一图胜千言,各平台上的编译器支持如下表所示,按平台选择即可:
4、其他工具
典型的比如:
Autoconf
:软件源码包的自动配置工具Make
:编译构建工具freetype
:一个免费的渲染库,JDK
图形化部分的代码可能会用它
好,环境盘点就到这里,接下来具体列一下我在编译
JDK 8
和JDK 11
时分别用到的软件详细版本信息:编译JDK 8时:
操作系统
:macOS 10.11.6boot JDK
:JDK 1.8.0 (build 1.8.0_201-b09)Xcode版本
:8.2编译器
:Version 8.0.0 (at /usr/bin/clang)
编译JDK 11时:
操作系统
:macOS 10.15.4boot JDK
:JDK 11.0.7 (build 11.0.7+8-LTS)Xcode版本
:11.5编译器
:Version 11.0.3 (at /usr/bin/clang)
大家在编译时如果过程中有很多问题,大概率少软件没装,或者软件版本不匹配,不要轻易放弃,需要耐心自查一下。
下载JDK源码
下载
JDK
源码其实有两种方式。方式一:通过Mercurial工具下载
Mercurial
可以理解为和Git
一样,是另外一种代码管理工具,安装好之后就有一个hg
命令可用。而
OpenJDK
的源码已经提前托管到http://hg.openjdk.java.net/
。因此,比如下载
JDK 8
,可直接hg clone
一下就行,和git clone
一样:hg clone http://hg.openjdk.java.net/jdk8/jdk8
同理,下载
JDK 11
:hg clone http://hg.openjdk.java.net/jdk/jdk11
但是这种方式下载速度不是很快。
方式二:直接下载打包好的源码包
下载地址:
https://jdk.java.net/
选择你想要的版本下载即可。
编译前的自动配置
源码包下载好,放到本地某个目录(建议路径纯英文,避免不必要的麻烦),解压之,然后进入源码根目录,执行:
sh configure
当然这里运行的是默认配置项。
这一步会进行一系列的自动配置工作,时间一般很快,最终如果能出现一下提示,那么很幸运,编译前的配置工作就完成了!
这里我给出我自己分别在配置
JDK 11
和JDK 8
时候完成时的样子:配置JDK 8完成:
配置JDK 11完成:
注: 如果这一步出错,大概率是某个软件环境未装,或者即使装了,但版本不匹配,控制台打印日志里一般是会提醒的。
比如我在配置
JDK 8
的时候,就遇到了一个errof:GCC compiler is required
的问题:明明系统里已经有编译器,但还是报这个错误。通过后来修改
jdk源码根目录/common/autoconf/generated-configure.sh
文件,将相关的两行代码注释后就配置通过了配置完成,接下来开始执行真正的编译动作了!
真正的编译动作
我们这里进行的是全量编译,直接在我们下载的
JDK
源码根目录下执行如下命令即可:make all
这一步编译需要一点时间,耐心等待一下即可。编译过程如果有错误,会终止编译,如果能看到如下两个画面,那么则恭喜你,自己编译
JDK
源码就已经通过了,可以搞一杯咖啡庆祝一下了。JDK 8编译完成:
JDK 11编译完成:
从两张图的对比可以看出,编译
JDK 8
和JDK 11
完成时在输出上还是有区别的。时间上的区别很大程度上来源于JDK 11
的编译机配置要高不少。
验证成果
JDK
源码编译完成之后肯定会产生和输出很多产物,这也是我们所迫不及待想看到的。由于
JDK 8
和JDK 11
的源码包组织结构并不一样,所以输出东西的内容和位置也有区别。我们一一来盘点一下。1、JDK 8的编译输出
编译完成,
build
目录下会生成一个macosx-x86_64-normal-server-release
目录,所有的编译成果均位于其中。首先,编译出来的
Java
可执行程序可以在如下目录里找到:jdk源码根目录/build/macosx-x86_64-normal-server-release/jdk/bin
进入该目录后,可以输入
./java -version
命令验证:其次,编译生成的成品
JDK
套装,可以在目录jdk源码根目录/build/macosx-x86_64-normal-server-release/images
下找到,如图所示:
其中:
j2sdk-image
:编译生成的JDKj2re-image
:编译生成的JRE
进入
j2sdk-image
目录会发现,里面的内容和我们平时从网络上下载的成品JDK
内容一致。2、JDK 11的编译输出
JDK 11的源码目录组织方式和JDK 8本身就有区别,编译生成的产物和上面编译JDK 8的输出有一定区别,但也不大。
JDK 11
编译完成,同样在build
目录下会生成一个macosx-x86_64-normal-server-release
目录,所有的编译成果均位于其中。同样编译出来的Java可执行程序可以在目录
JDK源码根目录/build/macosx-x86_64-normal-server-release/jdk/bin
下看到,进入该目录后,也可以输入
./java -version
命令验证:其次,编译生成的成品
JDK 11
套装,可以在目录JDK源码根目录/build/macosx-x86_64-normal-server-release/images
下找到,如图所示:
其中
jdk
目录就是编译生成的成品JDK 11
套装。
使用自己编译的JDK
既然我们已经动手编译出了
JDK
成品,接下来我们得用上哇。新建一个最最基本的
Java
工程,比如命名为JdkTest
,目的是把我们自己编译出的JDK
给用上。我们点开
Project Structure
,选到SDKs
选项,新添加上自己刚刚编译生成的JDK,并选为项目的JDK,看看是否能正常工作点击确定之后,我们运行之:
可以看到我们自己编译出的JDK已经用上了。
关联JDK源码并修改
我们继续在上一步
JdkTest
项目的Project Structure
→SDKs
里将JDK
源码关联到自行下载的JDK源码路径上:这样方便我们对自己下载的
JDK源码
进行阅读、调试、修改、以及在源码里随意做笔记和加注释。举个最简单的例子,比如我们打开
System.out.println()
这个函数的底层源码:我们随便给它修改一下,加两行简单的标记,像这样:
为了使我们新加的代码行生效,我们必须要重新去JDK源码的根目录中再次执行
make images
重新编译生成JDK方可生效:因为之前已经全量编译过了,所以再次
make
的时候增量编译一般很快。重新编译之后,我们再次运行
JdkTest
项目,就可以看到改动的效果了:
多行注释的问题
记得之前搭建《JDK源码阅读环境》时,大家可能发现了一个问题:阅读源码嘛,给源代码做点注释或笔记很常见!但那时候有个问题就是做注释时不可改变代码的行结构(只能行尾注释,不能跨行注释),否则debug调试时会出现行号错位的问题。
原因很简单,因为我们虽然做了源代码目录的映射,但是实际支撑运行的
JDK
还是预先安装好的那个JDK环境,并不是根据我们修改后的源码来重新编译构建的,所以看到这里,解决这个问题就很简单,就像上面一样自行编译一下JDK
即可。实际在实验时,还有一个很典型的问题是,当添加了多行的中文注释后,再编译居然会报错!
比如,还是以上面例子中最简单的
System.out.println()
源码为例,我们添加几行中文注释:这时候我们去JDK源码目录下编译会发现满屏类似这样的报错:
错误: 编码 ascii 的不可映射字符
顿时有点懵,毕竟仅仅是加了几行注释。对于我们来说,源码里写点多行的中文注释基本是刚需,然而编译竟会报错,这还能不能让人愉快的玩耍了… 当时后背有点发凉。
实不相瞒,就这个问题排查了一段时间,熬到了很晚。最终折腾了一番,通过如下这种方式解决了,顺便分享给小伙伴们,大家如果遇到了这个问题,可以参考着解决一下。
因为从控制台的报错可以很明显的看出,肯定是字符编码相关的问题导致的,而且都指向了
ascii
这种编码方式。于是将JDK的源码从根目录导入了Vs Code,然后全目录查找
encoding ascii
相关的内容,看看有没有什么端倪,结果发现jdk源码根目录/make/common/SetupJavaCompilers.gmk
文件中有两处指定了ascii
相关的编码方式:于是尝试将这两处
-encoding ascii
的均替换成-encoding utf-8
:然后再次执行
make images
编译,编译顺利通过!至此大功告成!
这样后面不管是阅读、调试还是定制
JDK
源码都非常方便了。后记:这篇文章在开源项目:https://github.com/hansonwang99/JavaCollection 中也已经收录了,包含自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
每天进步一点点
慢一点才能更快
-
JDK源码包(包含sun包下的源码)
2020-10-19 10:04:43jdk安装后,里面会带有一个src.zip的文件,但文件中没有sun包下的源码,因此需要单独下载。本上传资源的JDK源码文件包含sun包下的源码。 -
绝对良心提供百度网盘的jdk1.8源码下载包含sun包的-附件资源
2021-03-05 15:17:24绝对良心提供百度网盘的jdk1.8源码下载包含sun包的-附件资源 -
jdk15.zip jdk15的源码包,直接解压即可
2020-12-04 16:42:16在官网下载的openjdk15的源码包,解压缩既可以用,这是源码包所以linux、windows都可以用 -
使用IDEA读JDK源码
2021-05-23 15:13:34建议人手一个,每当心血来潮时、遇到问题时、碰到疑惑时、闲得无聊时都可以打开工程看一看源码,做做笔记和注释。 搭建源码阅读调试环境 ...3、导入JDK源码 有很多小伙伴问JDK的源码在哪里呢? 远在天边,仅...建议人手一个,每当 心血来潮时 、 遇到问题时 、 碰到疑惑时 、 闲得无聊 时都可以打开工程看一看源码,做做笔记和注释。
搭建源码阅读调试环境
我个人觉得看源码这个事情还是应该单独搞一个Java工程,源码放里面,测试代码也放里面, 集中调试 , 集中看代码 , 集中写注释 比较方便一些。
1、创建源码阅读项目
选择最普通的Java基础项目即可:
2、创建两个目录
分别为:
source
test
3、导入JDK源码
有很多小伙伴问 JDK的源码在哪里呢?
远在天边,仅在眼前,其实在的 JDK安装目录 下就能找到。
JDK安装目录下有一个名为
src.zip
压缩包,这正是JDK源码!将其解压后拷贝到上面项目的
source
目录下,这样JDK源码就导入好了。有些小伙伴会有疑问, 为什么要将JDK源码导一份放到这个项目里? 其实主要原因还是方便我们在源码里阅读、调试、以及做笔记和注释。
4、调试并运行
我们可以在
test
目录里去随意编写一段测试代码。比如我这里就以
HashMap
为例,在test
目录下创建一个子目录hashmap
,然后在里面创建一个测试主入口文件Test.java
,随意放上一段测试代码:public static void main( String[] args ) { Map<String, Double> hashMap = new HashMap<>(); hashMap.put( "k1", 0.1 ); hashMap.put( "k2", 0.2 ); hashMap.put( "k3", 0.3 ); hashMap.put( "k4", 0.4 ); for ( Map.Entry<String, Double> entry : hashMap.entrySet() ) { System.out.println( entry.getKey() + ":" + entry.getValue() ); } }
不过接下来会有几个问题需要一一去解决。
问题一:启动调试时Build报错,提示系统资源不足
解决方法:加大
Build process heap size
。设置方法:
Preferences --> Build,Execution,Deployment --> Compiler
,将默认700
的数值加大,比如我这里设置为1700
:问题二:想从外层代码F7单步调试进入JDK源码内部,结果发现进不去
这是因为调试时,JDK源码受保护,一般单步调试不让进,但是可以设置。
解决方法::
Preferences --> Build,Execution,Deployment --> Debugger --> Stepping
问题三:如何对JDK源码做注释?
调试进入JDK源码以后,发现不能进行注释,每个文件上都有一个小锁的图标,这是因为现在关联的源码并不是我们项目里刚拷进去的源码,而是JDK安装目录下的
src.zip
只读压缩包。解决办法:重新关联JDK源码路径为本项目路径下的这一份JDK源码。
这样一来,我们就可以愉快地对JDK源码调试以及做注释了。
-
Java| 调试JDK源码-附件资源
2021-03-05 15:20:14Java| 调试JDK源码-附件资源 -
JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码
2021-11-19 15:46:26下载jdk压缩包版就可以,解压后,文件路径中会有一个src.zip文件,这个就是jdk源码。 解压后就可以获得jdk源码啦。建议拷贝后换个路径再解压。如下是我存放的路径 ????导入IDEA ☘️新建java项目 使用默认配置,...🍀jdk下载
本文使用JDK版本为
jdk1.8
下载地址:https://www.oracle.com/java/technologies/downloads/archive/
🍀获取源码
下载jdk压缩包版就可以,解压后,文件路径中会有一个
src.zip
文件,这个就是jdk源码。
解压后就可以获得jdk源码啦。建议拷贝后换个路径再解压。如下是我存放的路径
🍀导入IDEA
☘️新建java项目
使用默认配置,选择下一步
勾选从模板创建项目,再选择下一步
选择jdk源码路径,完成创建新项目
导入后显示文件结构
🍀IDEA相关后续配置
☘️项目的JDK关联当前src源码
将原来的src.zip替换成现在解压后的版本
修改项目使用jdk
☘️com.sun.tools.javac.api不存在,导入安装jdk路径下的lib
☘️sun.awt.UNIXToolkit和sun.font.FontConfigManager不存在,下载导入openjdk的源码
新建UNIXToolkit.java和FontConfigManager.java类,注意包名一致。
到OpenJDK寻找sun.awt.UNIXToolkit和sun.font.FontConfigManager的源码,分别复制到上面新建的两个类里下载jdk8u的可以直接使用上面的链接,其他版本可参考下图寻找openjdk源码
复制sun.awt.UNIXToolkit和sun.font.FontConfigManager源码替换我们刚刚新建的两个类就可以了。配置好应该就也可以开始愉快的学习了。
🍀测试类
package com.ber; import java.util.HashMap; public class Main { public static void main(String[] args) { // write your code here HashMap hashMap = new HashMap<>(); hashMap.put("k1","v1"); hashMap.put("k2","v2"); hashMap.put("k3","v3"); hashMap.put("k4","v4"); hashMap.put("k5","v5"); hashMap.get("k2"); } }
如图,已成功debug。🍀Tips
博主没有遇到
OutOfMemoryError
内存溢出错误,如果有小伙伴存在这个错误。可以尝试调大构建项目的内存大小。具体设置:Settings—>build,execution,deployment---->compiler---->Build process heap size (Mbytrs)
🍀有小伙伴不想动手配置,上传一份配置好的jdk源码
-
Mac搭建JDK源码阅读环境
2021-05-12 22:07:08想要读懂JDK源码,需要在自己电脑上搭建JDK的源码阅读环境,正所谓,工欲善其事,必先利其器。下面演示如何在Mac上结合Idea搭建JDK1.8的源码阅读环境。 新建一个空的Java项目 在Idea中选择File–>New–>... -
jdk8源码包
2018-09-13 15:18:25该压缩包中放的是jdk8的源码包,把该资源导入eclipse中就可看到jdk的源码! -
JDK源码环境搭建
2021-03-11 11:58:15本教程是用idea搭建,jdk源码就在jdk安装路径下的src.zip中,解压即可用。第一步:新建项目打开IDEA,按如下步骤新建一个简单Java项目create new project新建一个简单Java项目点击finish后,项目就创建好了第二步:... -
JDK源码阅读调试环境搭建
2020-04-06 17:51:33JDK全称Java SE Development kit(JDK),即java标准版开发包,是Oracle提供的一套用于开发java应用程序的开发包,它提供编译,运行java程序所需要的各种工具和资源,包括java编译器,java运行时环境,以及常用的java... -
JDK1.8源码
2018-12-11 11:44:50此资源是Jdk 1.8的源码,并将所有的源码移到maven项目中,但移除了其中的sun部分,感觉这部分的已经过时,没有太大的必要去研究学习呢,可以下载下来直接导入IDE中,然后编辑,调试学习源码。 -
搭建JDK源码阅读环境
2021-04-15 20:22:59idea搭建JDK源码阅读环境 源码资源 设置IDEA 导入源码 关联展示 第一章 源码资源 第01节 环境的准备 我使用的环境 1. IDEA 2018.3.5 ULTIMATE 环境 2. JDK8 u221 3. Windows 10 环境 效果图 第02节 处理源... -
jdk8源码_rt.zip
2021-12-23 09:58:06jdk8目录下的源码不包含rt.jar中的源码,本资源只包含rt.jar包的源码,注意:模块的源码不需要下载,你安装好jdk后,会在${JAVA_HOME}的根目录下找到src.zip,这就是src.jar的源码。 -
IDEA编译JDK1.8源码及运行测试--终于可以debug进带注释的JDK源码了
2020-12-31 11:07:01一、JDK源码源码导入IDEA前资源准备 在自己安装好的JDK1.8版本目录下,找到src.zip,这个就是源码(没有JDK1.8的自行去官网下载,我的版本是jdk1.8.0_271)。 2.在自己电脑磁盘新建项目目录JDK1.8.0_271_source,... -
引入JDK源码学习的Java程序设计实践教学.doc
2020-10-27 08:35:04引入JDK源码学习的Java程序设计实践教学-教育技术学论文 引入JDK源码学习的Java程序设计实践教学 唐大仕 北京大学 信息科学技术学院北京100871 摘要提出在课程中引入JDK源码的学习阐述通过阅读分析重写及应用JDK源码... -
调试JDK源码时可编辑操作的实现
2021-03-14 11:03:14以下操作在以下环境中测试通过:idea 2019.3,jdk8源码包一、解压源码压缩包从jdk安装目录中找到 src.zip 的源码压缩包,解压后得到源码文件夹二、创建Java项目因主要目的是调试源码,了解其功能的实现过程,所以在... -
idea查看jdk源码并在源码中写注释
2020-03-01 19:09:42想要查看jdk源码并希望能够写一些注释。以下是一些概要的步骤,以及会遇到的一些问题。 新建一个项目,并将jdk安装目录下的src压缩包解压到项目下并替换原来的src。 需要让debug时自动关联到项目的src中的源码。 ... -
Apache Harmony(Apache版JDK)源码(珍贵资源)
2018-02-28 09:58:46Harmony 为自己定了两个目标,首先是开发出一个独立并且与现有 JDK 兼容的 Java SE 5 实现,并且以 Apache 软件许可证 2.0 版发行;其次是建立一个开放的模块化运行时架构,包括虚拟机和类库之间及其内部的模块化,... -
使用IDEA从零开始搭建一个JDK源码的阅读项目(按照步骤来小白也能行哟)
2021-03-08 01:13:53从零开始搭建一个JDK源码的阅读工程原视频地址1.新建一个java项目1.Create new Project2. next3. 选中创建模板 继续 next4.完成创建项目5.项目效果图2.添加源码2.1找到源码JDK源码存储的位置即你安装JDK的路径。例如... -
利用IDEA搭建JDK源码阅读环境教程
2020-03-26 13:07:28利用IDEA搭建JDK源码阅读环境教程——源码面前没有秘密! -
jdk1.8 sun源码
2018-09-13 16:46:29由于默认JDK不包含全部SUN的源码,这个网上找了半天才找到。本来想免费的无奈scdn必须设置资源分数最小是1 -
JDK源码学习手册(一)
2018-08-30 11:35:26JDK源码学习(准备篇) 本文为菜鸟整理文章,在学习过程中根据自己的学习过程和逻辑点将现有知识进行整合,本人玻璃心小女子一枚,新手上路,可以接收指教,但不接受指点,谢谢! 准备篇包含以下内容 1.jdk... -
如何使用Jdk查看源码?
2020-07-26 19:06:51你好,我是刚毕业的学生,想学习Java开发,但是不知道JDK用哪个版本好呢,怎么查看sdk源码呢? 今天有小伙伴问我java开发用哪个版本的jdk比较好,作为一个jdk使用了8-9年的老开发来说,甚至jdk的重要,当然很清楚... -
好家伙!这一篇文章就给你讲明白了Java并发实现原理之JDK源码剖析(PDF文档)
2021-03-12 10:34:52前言并发编程可选择的方式有多进程、多线程和多协程。对于Java来说,它既不像C++...但在多线程下,多个线程的代码交叉并行,要访问互斥资源,要互相通信。作为开发者,需要仔细设计线程之间的互斥与同步,稍不留心,...