1.2. 自己编译JDK
1.2.1. 获取源码
获取OpenJDK
源码有两种方式:
通过
mercurial
代码版本管理工具从repository
中直接取得源码(repository
地址:http://hg.openjdk.java.net/jdk/jdk12),获取过程如下命名所示:hg clone http://hg.openjdk.java.net/jdk/jdk12
直接访问准备下载的
JDK
版本的仓库页面(譬如本例中的OpenJDK12
的页面为:http://hg.openjdk.java.net/jdk/jdk12/),然后点击左边菜单中的“Browse
”,将显示如下的源码根目录页面。
此时点击左边的“zip
”链接即可现在当前版本打包好的源码,到本地直接解压即可。
1.2.2. 系统需求
为了尽量少出错误,我选择了比较新的OpenJDK
版本(OpenJDK12
),编译系统采用的是MacOS
,而且要求本地要有至少为N-1
的、编译好的JDK
(也就是说我这里会选择至少为OpenJDK11
的版本)。
为了减少系统中安装的JDK
版本过多,本人使用sdkman作为我的软件开发套件的并行版本工具,具体如何使用请去浏览sdkman
的官网(https://sdkman.io/)。
在控制台使用sdk list java
命令可以查看本机的JDK
版本,由下图可以发现我使用的就是OpenJDK11
版本,后续我们会将自己编译好的jdk
也交于sdkman
去管理,这样就省去了配置JAVA_HOME
的麻烦。
1.2.3. 构建编译环境
对于MacOS
,需要MacOSX10.13
版本以上,并安装好最新版本的XCode
和Command Line Tools for XCode
,这两个SDK
提供了OpenJDK
所需要的CLang
编译器以及Makefile
中用到的其他外部命令。
在编译的过程中需要依赖若干的第三方库,这里不需要列出OpenJDK
编译依赖库,不列出的原因在后续步骤就会知晓。
1.2.4. 进行编译
进入到刚才解压的jdk
目录下:
cd WorkSpaces/OpenSourceProject/jdk12
编译OpenJDK
不仅仅是为了叨叨在自己机器中诞生的编译成品,而是带着调试,定制化等需求,这样就必须了解OpenJDK
提供的编译参数才行,这些参数可以使用“bash configure --help
”命令查询到,编译参数有很多,我们可以选择使用,下面是其中一部分的参数展示:
以上是configure
命令的部分参数,所有参数均可通过以下形式使用:
bash configure [options]
譬如,编译FastDebug版、仅含Server模式的HostSpot虚拟机,命令应为:
bash configure --enable-debug --with-jvm-variants=server
configure
命令承担了依赖项检查、参数配置和构建输出目录结构等多项职责,如果编译过程中需要的工具链或者依赖项有所缺失,命令执行后将会得到明确的提示,并且该出该依赖的安装命令。
如果一切顺利的话,就会收到配置成功的提示,并且输出调试级别,Java虚拟机的模式、特性、使用的编译器版本
等配置摘要信息,如下所示:
在configure
命令之后需要执行make命令,即在使用bash configure
命令完成依赖检查之后便可以输入“make images
”执行整个OpenJDK
编译了。编译很少会一帆风顺的,我在编译的时候就出现错误,这个时候就要求具备一些解决debug
的能力,我出现的错误如下所示:
由以上可以看出,导致编译中断是因为测试程序中有错误,而我出现的这个错误很简单,给的提示也很明显,通过观察指定代码的上线文之后,发现出错的代码在后续程序中没有被引用到,所以我就采取最简单的方式,注释掉即可,具体如下所示:
在编译出错解决完问题之后,一定要先运行“make clean
”和“make dist-clean
”命令,接着运行“bash configure
”命令,最后再运行”make images
“,如果一切顺利你就会看到如下提示信息:
编译完成之后,进入到OpenJDK
源码的“build/配置名称/jdk
”目录下就可以看到OpenJDK
的完整编译结果了,具体如下所示:
然后使用sdk install命令,安装jdk
到sdkman
:
sdk install java myself-open-12 /Users/gnehcgnaw/WorkSpaces/OpenSourceProject/jdk12/build/macosx-x86_64-server-fastdebug/jdk
这时候使用在终端再次使用sdk list java
,就发现了自己编译的jdk
版本了,具体如下所示:
然后使用使用sdk default命令切换jdk
版本,具体如下所示:
sdk default java myself-open-12
1.2.5. 在IDE工具中进行源码调试
使用CLion
新建一个项目,选择“New CMake Project from Sources
”,在源码文件夹中填入OpenJDK
源码根目录,此时,CLion
已经自动选择好了需要导入的源码,具体如下图所示,点击OK
按钮就会导入源码并自动创建好CMakeLists.txt
文件。
这份自动生成的CMakeLists.txt
并不能直接使用,OpenJDK
本身也没有为任何IDE
提供支持,但是如果只是为了能够在CLion
中跟踪、阅读源码,而不需要修改重新编译的话,那直接在Run/Debug Configurations
中添加一个CMake Application
,然后Executable
选择我们刚才编译出来的FastDebug
版的java
命令,运行参数加上-version
或着某个class
文件的路径,再把Before launch
里面的Build
去掉,就可以开始运行调试了,具体如下图所示:
点击“Run
”,看到如下图所示,就说明可以调试程序了。
下面进行Java
程序与JDK
源码联合调试,调试代码如下所示:
思路:先用javac
将Xx.java
编译成Xx.class
,然后用java Xx
命令运行得到程序结果。
所以,配置如下:
点击CLoin
中的debug
,显示如下:
最后运行结果是:
说明可以进行联合调试了。