题外话
最近在阅读《深入理解Java虚拟机》,其中有一小节实战是自己编译JDK,实际操作过程中遇到了不少问题,为此特地记录一下,也希望可以为大家带来一些参考
前置准备
平台及工具:Windows 10 + WSL(ubuntu 20.04) + CLion(2021.2.2)
OpenJDK12下载地址:https://hg.openjdk.java.net/j...
- 下载安装解压即可
文章图片
编译工具版本推荐:
GCC 7.4及以上
# Ubuntu上安装GCC命令,该命令默认安装9.3版本(2021年) sudo apt-get install build-essential
工具 | 库名称 | 安装命令 |
---|---|---|
FreeType | The FreeType Project | sudo apt-get install libfreetype6-dev |
CUPS | Common UNIX Printing System | sudo apt-get install libcups2-dev |
X11 | X Window System | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev |
ALSA | Advanced Linux Sound Architecture | sudo apt-get install libasound2-dev |
libffi | Portable Foreign Function Interface Library | sudo apt-get install libffi-dev |
Autoconf | Extensible Package of M4 Macros | sudo apt-get install autoconf |
- OpenJDK11
sudo apt-get install openjdk-11-jdk
bash configure --enable-debug --with-jvm-variants=server# 嫌写那么多麻烦,直接用下面这个,不过这个是生成release版本的,不利于debug
bash configure
configure命令会进行依赖项检查,参数配置和构建输出目录结构等操作,所以依赖缺失会得到明确提示:
文章图片
ZIP安装命令:
sudo apt-get install zip
继续检查...继续安装缺失的依赖...
文章图片
成功界面:
文章图片
依赖检查通过后,执行
make images
命令执行整个OpenJDK的编译,作用是编译出整个JDK镜像不出所料,编译报错:
文章图片
充分利用了搜索引擎,以及认真阅读了
building.md
文件后,发现应该是gcc的版本问题,默认安装的是9,但实际需要的是7,于是把9给卸载了,重新安装了个7# 卸载命令
sudo apt-get remove gcc-9
# 安装7
sudo apt-get install gcc-7
sudo apt-get install g++-7# 如果上述命令安装后,gcc --version能查出版本而不会报错,就无需使用以下命令
# 或者已有7和9两个版本,但默认用的是9,也可用以下命令修改为7# 设置默认选项
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --config gccsudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
sudo update-alternatives --config g++
文章图片
万事俱备只欠东风。先
make dist-clean
清理一波编译生成的临时文件,接着一波流:bash configure --enable-debug --with-jvm-variants=server
make images
漫长的等待后...没有报错!!!
测试一波:
./build/*/images/jdk/bin/java -version
编译成功:
文章图片
目录结构:
文章图片
在IDE工具上调试 导入JDK源码文件,open file 选择
MakeFile
,有弹窗清除clean
,然后一直确认即可文章图片
等待导入......
接着会发现帮你生成了一堆的
targets
,将根目录Mark Directory as 一下文章图片
然后选
all
即可,打开编辑,Executable选择编译出来的java
命令,Before launch移除Build
具体设置各项参数如图:
文章图片
找到
java.c
文件,打个断点,直接Debug
启动(开始你的表演):文章图片
配置
-version
只是测试一下是不是真的能够调试了而已,如果想要调试某个Java类呢文章图片
IDEA配合Clion远程调试 IDEA配置
- 添加Configuration,选择Remote JVM Debug即可:
文章图片
Clion配置
- 添加Configuration,选择Custom Build Configuration
- Target 需要添加一下,
- make编译配置
文章图片
- make clean配置
文章图片
- make编译配置
- Executable依然选择编译出来的Java命令
- Program arguments填写:
-jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5008 xxx.jar
- Working directory选择:上述jar包生成位置
【深入理解Java虚拟机之自己编译JDK】
文章图片
参考资料
《深入理解Java虚拟机:JVM高级特性与最佳实践》(第三版)1.6实战:自己编译JDK
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)