目录
最近由于项目需要接触了JDK,这里记录一下如何编译和调试JDK11的源码。
编译
源码选择
我调试的源码是launchpad上的版本,下载地址在这里。
之所以选择这个版本是为了方便打包。lp里的JDK是和JDK社区同步更新的。
以我选择的版本为例子,需要选择以下三个文件。
- openjdk-lts_11.0.20+8-1ubuntu1~20.04.debian.tar.xz (157.9 KiB)
- openjdk-lts_11.0.20+8-1ubuntu1~20.04.dsc (4.5 KiB)
- openjdk-lts_11.0.20+8.orig.tar.xz (65.6 MiB)
下载完成后进行解压,获得源码。
dpkg-source -x *.dsc
编译过程
在编译之前,需要安装boot jdk,JDK11的boot jdk选择11即可。
sudo apt install openjdk-11-jdk
进入源码目录,执行以下命令:
bash configure --enable-debug --with-jvm-variants=server --with-target-bits=64 MAKE=/usr/bin/make --with-pcsclite=bundled --disable-warnings-as-errors --with-libjpeg=system --with-lcms=system --with-giflib=system --with-libpng=system
如果提示确实库自行补全。
然后进行编译:
time make images
如果顺利的话,大概需要编译10min左右。
如果编译过程提示找不到DEBIAN_JDK_BASE_DIR,在Launcher-java.base.gmk:61行加入如下语句:
export DEBIAN_JDK_BASE_DIR=/usr/lib/jvm/java-11-openjdk-amd64/
编译完成的文件在当前的build目录下,比如我编译出来的java文件就在
./build/linux-aarch64-normal-server-fastdebug/jdk/bin/java
然后我们可以测试一下编译出来的二进制是否能用。
./build/linux-aarch64-normal-server-fastdebug/jdk/bin/java -version
如果能正常输出的话,证明你已经编译成功啦!
调试
我们可以使用intel idea调试java程序,不过在调试时,默认无法跟进JDK内部。
需要额外的设置。(图来自这里)
这样我们就可以跟进JDK内部了。