版本 | |
---|---|
操作系统 | Ubuntu 20.04.2 LTS |
编译的jdk | jdk8 |
boot jdk | jdk7 |
看源码的工具 | Clion |
安装引导 JDK。 所有 OpenJDK 构建都需要访问以前发布的 JDK,称为引导 JDK。 一般规则是引导 JDK 必须是 JDK 先前主要版本的实例。
比如,构建JDK 8需要使用更新为7或更高版本的JDK 7版本。
JDK 8开发人员不应使用JDK 8作为引导JDK,以确保使用JDK 7构建的系统部分不会引入JDK 8依赖项。摘自 http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html#setup
git clone https://github.com/AdoptOpenJDK/openjdk-jdk8u
如果 GitHub 下载太慢也可以选择 Gitee 镜像,我把 openjdk 源码放在 ~/CLionProjects
文件夹下:
[email protected]:~$ cd ~/CLionProjects
[email protected]:~/CLionProjects$ git clone -b jdk8-b120 https://gitee.com/mirrors/openjdk.git
我选择把 jdk 安装在
/opt/lib/jdk
文件夹,你可以选择直接安装在~
即用户文件夹下。
[email protected]:~$ cd /opt/lib/jdk
[email protected]:/opt/lib/jdk$ sudo wget https://repo.huaweicloud.com/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz
[email protected]:/opt/lib/jdk$ sudo tar -zxvf jdk-7u80-linux-x64.tar.gz
[email protected]:/opt/lib/jdk$ sudo mv jdk1.7.0_80/ jdk7/
[email protected]:~$ vim ~/.bashrc
在文件末尾追加以下内容:
export JAVA_HOME=/opt/lib/jdk/jdk7 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
保存并退出,然后执行:
[email protected]:~$ source ~/.bashrc
[email protected]:~$ sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache
编译的时候需要用到
[email protected]:~$ cd ~/CLionProjects/openjdk
[email protected]:~/CLionProjects/openjdk$ ls -al | grep configure
-rw-r--r-- 1 csdn sudo 1235 8月 12 09:05 configure
因为,默认情况下configure不是可执行文件,执行命令为文件所有者增加可执行权限
[email protected]:~/CLionProjects/openjdk$ chmod u+x configure
[email protected]:~/CLionProjects/openjdk$ ls -al | grep configure
-rwxr--r-- 1 csdn sudo 1235 8月 12 09:05 configure
[email protected]:~/CLionProjects/openjdk$ sudo ./configure --with-target-bits=64 --with-boot-jdk=/opt/lib/jdk/jdk7 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
看到以下这个画面就证明配置成功了,就可以编译了。如果不是,就得一步步把问题解决了再重新配置
我尝试用 gcc-9 版本编译,结果有很多我无法解决的编译问题,所以我还是把版本降到了 gcc-5 如需要了解《Ubuntu20.04 使用apt安装gcc-5》点击此处
如果切换了 gcc,你也需要重新执行上面的 ./configure ... 操作,同时建议执行一个 make clean 再进行 make all
[email protected]:~/CLionProjects/openjdk$ sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0 WARNINGS_ARE_ERRORS=-Wno-all
首次编译经过漫长的时间之后,出现下图,恭喜你编译成功了!
error: ‘int readdir_r(DIR*, dirent*, dirent**)’ is deprecated [-Werror=deprecated-declarations]
以下摘自《JVM-Ubuntu18.04.1下编译OpenJDK8》:
查阅网上资料说是这是因为 glibc >= 2.24 的情况下,方法 readdir_r is deprecated,不支持了,通过
getconf GNU_LIBC_VERSION
检查发现 Ubuntu 20.04.4 LTS 版本为 glibc 2.31,而且也有很多人在OpenJDK上报了BUG,链接 https://bugs.openjdk.java.net/browse/JDK-8179887,6/7/8/9都不打算修复此问题,会在11修复这个BUG,所以当前只能通过其他的方式来解决,解决方案如下:在 ./hotspot/make/linux/makefiles/gcc.make文件中找到 WARNINGS_ARE_ERRORS=-Werro,注释该段或改成
WARNINGS_ARE_ERRORS=-Wno-all
。再编译就会忽略掉警告,直到编译完成。
当然,我是选择直接把这个选项追加到 make all 命令的末尾。
CLion这个IDE不支持Makefile,仅支持cmake,比较麻烦。因此可以在项目目录 /home/geekziyu/CLionProjects/openjdk 中添加一个 CMakeLists.txt 文件,下面仅供参考:
cmake_minimum_required(VERSION 3.16) project(hotspot8) file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h") include_directories("/home/geekziyu/CLionProjects/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include/") include_directories("/home/geekziyu/CLionProjects/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include/linux") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/prims") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/precompiled") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/runtime") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/utilities") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/classfile") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/oops") include_directories("/home/geekziyu/CLionProjects/openjdk/jdk/src/solaris/bin") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/cpu/x86/vm") include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/interpreter") add_executable(hotspot8 ${SOURCE_FILES})
接着,从顶部菜单栏找到 Run | Edit Configurations... 点击后打开 Run/Debug Configurations 对话框
点击左上角 +
添加 CMake Application
-XX:-PrintInterpreter -XX:-UseTLAB -XX:-TraceBytecodes -Xms10m -Xmx10m -XX:-UseTLAB -XX:+UseG1GC -XX:-UseConcMarkSweepGC -XX:-PrintGCDetails -XX:-TraceBytecodes -cp "/home/geekziyu/IdeaProjects/helloworld/target/classes" com.example.Main
JVM专家教你快速搭建单步调试openjdk环境,最新版(值得收藏)