版本 | |
---|---|
操作系统 | 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
一、准备源码环境一条龙
1.1 下载要编译的源码
git clone https://github.com/AdoptOpenJDK/openjdk-jdk8u
如果 GitHub 下载太慢也可以选择 Gitee 镜像,我把 openjdk 源码放在 ~/CLionProjects
文件夹下:
geekziyu@geekziyu-ubuntu-1:~$ cd ~/CLionProjects
geekziyu@geekziyu-ubuntu-1:~/CLionProjects$ git clone -b jdk8-b120 https://gitee.com/mirrors/openjdk.git
1.2 下载和解压jdk7
我选择把 jdk 安装在
/opt/lib/jdk
文件夹,你可以选择直接安装在~
即用户文件夹下。
geekziyu@geekziyu-ubuntu-1:~$ cd /opt/lib/jdk
geekziyu@geekziyu-ubuntu-1:/opt/lib/jdk$ sudo wget https://repo.huaweicloud.com/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz
geekziyu@geekziyu-ubuntu-1:/opt/lib/jdk$ sudo tar -zxvf jdk-7u80-linux-x64.tar.gz
geekziyu@geekziyu-ubuntu-1:/opt/lib/jdk$ sudo mv jdk1.7.0_80/ jdk7/
1.3 配置环境变量
geekziyu@geekziyu-ubuntu-1:~$ 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:$PATH
保存并退出,然后执行:
geekziyu@geekziyu-ubuntu-1:~$ source ~/.bashrc
1.4 apt安装依赖
geekziyu@geekziyu-ubuntu-1:~$ sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache
编译的时候需要用到
1.5 configure & make
geekziyu@geekziyu-ubuntu-1:~$ cd ~/CLionProjects/openjdk
geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ ls -al | grep configure
-rw-r--r-- 1 csdn sudo 1235 8月 12 09:05 configure
因为,默认情况下configure不是可执行文件,执行命令为文件所有者增加可执行权限
geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ chmod u+x configure
geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ ls -al | grep configure
-rwxr--r-- 1 csdn sudo 1235 8月 12 09:05 configure
geekziyu@geekziyu-ubuntu-1:~/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 WARNINGS_ARE_ERRORS=-Wno-all
看到以下这个画面就证明配置成功了,就可以编译了。如果不是,就得一步步把问题解决了再重新配置
我尝试用 gcc-9 版本编译,结果有很多我无法解决的编译问题,所以我还是把版本降到了 gcc-5 如需要了解《Ubuntu20.04 使用apt安装gcc-5》点击此处
如果切换了 gcc,你也需要重新执行上面的 ./configure ... 操作,同时建议执行一个 make clean 再进行 make all
geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0 WARNINGS_ARE_ERRORS=-Wno-all
首次编译经过漫长的时间之后,出现下图,恭喜你编译成功了!
1.6 关于 readdir_r is deprecated 问题
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单步调试
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
- Target 这个不重要,我选择了 All Targets
- Executable 选择编译后的源码中的 java 程序,我的路径为 /home/geekziyu/CLionProjects/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java
- Program arguments 如下所示,注意替换编译后的 Java class文件路径和待启动的 Class类名
-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
- Before Launch 中的 Build 被我移除了
关于我遇到的 Run/Debug 按钮都是灰色不可用的问题
-
CLion 顶部菜单栏 File | Close Project
-
删除 .idea 文件夹 geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ rm -rf .idea
-
CLion File | Open...,选择我们刚才创建的 CMakeLists.txt ,然后弹出对话框选择 Open As Project
-
弹出一个 Toolchains 配置的对话框,主要是配置 make,gcc,g++ 的路径
-
重新打开项目后,再重做一下 CMake Application 的配置即可