由于最近一直在研究并发,所以难免会搞到Java的底层源码,所以编译JDK的源码是非常有必要的,笔者编译JDK源码的环境如下:
系统:Ubuntu18.04.4
JDK源码:JDK12
请尽量和笔者的编译环境一致。
-
下载JDK12的源码
-
方式一:Linux下面直接执行如下的命令
hg clone https://hg.openjdk.java.net/jdk/jdk12
下载完成过后的目录情况
-
方式二:直接去openjdk的官网下载,具体的地址是:https://hg.openjdk.java.net/jdk/jdk12
-
-
构建编译环境:
-
在Ubuntu系统上安装GCC
sudo apt-get update sudo apt-get install build-essential
-
安装OpenJDK编译依赖库
-
FreeType的安装
sudo apt-get install libfreetype6-dev
-
CUPS的安装
sudo apt-get install libcups2-dev
-
X11安装
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
-
ALSA安装
sudo apt-get install libasound2-dev
-
libffi安装
sudo apt-get install libffi-dev
-
Autoconf安装
sudo apt-get install autoconf
-
最后,假设要编译大版本号为N的JDK,我们还要准备一个大版本号至少为N-1的、已经编译好的JDK。这是因为OpenJDK由多个部分(HotSpot、 JDK类库、 JAXWS、 JAXP……) 构成, 其中一部分( HotSpot) 代码使用C、 C++编写, 而更多的代码则是使用Java语言来实现, 因此编译这些Java代码就需要用到另一个编译期可用的JDK, 官方称这个JDK为“Bootstrap JDK”。 编译OpenJDK 12时, Bootstrap JDK必须使用JDK 11及之后的版本。 在Ubuntu中使用以下命令安装OpenJDK11:
sudo apt-get install openjdk-11-jdk
-
-
进行编译
-
编译前依赖项的检查,参数配置和构建输出目录结构,具体命令如下:
bash configure --enable-debug --with-jvm-variants=server
发现有个报错,于是根据它的提示执行了如下命令
sudo apt-get install libfontconfig1-dev
再次执行config的命令
发现预编译通过,接下来就可以编译,但是笔者在编译的过程发现了一个致命的问题,就是jdk12的源码路径不能有中文,于是我将其移动到一个没有中文目录的路径下进行编译
-
进行编译
make images
有个地方会卡很久,请耐心等待
最后就编译成功
测试编译是否成功,进入编译目录下的build/linux-x86_64-server-fastdebug/jdk/bin/,执行如下的命令:
./java -version
-
-
在IDE工具中进行源码的调试
-
下载安装,网址是:https://www.jetbrains.com/clion/
-
在JDK12的根目下新建CMakeLists.txt文件,具体内容如下
cmake_minimum_required(VERSION 3.7) project(hotspot) include_directories( src/hotspot/cpu src/hotspot/os src/hotspot/os_cpu src/hotspot/share src/hotspot/share/precompiled src/hotspot/share/include src/java.base/unix/native/include src/java.base/share/native/include src/java.base/share/native/libjli ) file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h") add_executable(hotspot ${SOURCE_FILES})
-
导入项目
选择刚才创建好的CMakeLists.txt打开即可。
等待项目构建完成。
-
-
测试调试
-
编写Java代码放到jdk12/build/linux-x86_64-server-fastdebug/jdk/bin/,具体编写的Java代码如下
public class Test{ public static void main(String[] args){ System.out.println("haha"); } }
-
将此代码编译成.class文件
-
配置Clion中运行配置
-
调试
- 在java.c文件中JavaMain打上对应的断点,然后点击调试
-
-
至此所有的编译和调试工作全部做完,主要参考了周志明大佬的《深入理解JVM虚拟机》