折腾日记:构建JDK9源码
作为JAVA开发者,JDK一定天天都会用到,所以想这周编译一下JDK源码,项目一直在使用JDK8,所以可以编译JDK9,这里的JDK指的是openJDK,每个版本的JDK编译都需要一个Boot JDK(可以参考building.html
中编译指南),比如JDK9,就需要JDK8
openJDK做为GPL许可(GPL-licensed)的Java平台的开源化实现
环境准备
-
CentOS7 64位
-
Openjdk version "1.8.0_272"
系统选择
- 非常不建议在window环境下折腾编译JDK,window环境需要安装Cygwin64、visual Studio的c环境jdk,然后
./configure
会出现各种你想象不到问题,需要修改检验文件,环境校验过了,也会出现编译的问题 - 其实一开始我在ubuntu环境下编译JDK的,会出现这个问题
os_linux.inline.hpp:127:18: error: 'int readdir_r(DIR*, dirent*, dirent**)' is deprecated [-Werror=deprecated-declarations]
这里是由于因为glibc >= 2.24
的情况下,方法 readdir_r被 deprecated,不支持了,通过getconf GNU_LIBC_VERSION
检查发现Ubuntu 18
版本为glibc 2.27
,可以查看这个BUG反馈
https://bugs.openjdk.java.net/browse/JDK-8179887,6/7/8/9
下载源码
- JDK的源码下载需要安装
mercurial
,
yum install mercurial
- 下载源码
hg clone http://hg.openjdk.java.net/jdk9/jdk9 MyOpenJDK
进入下载的文件夹下执行下载的shell脚本
sh get_source.sh
是不是觉得很简单?然而,我还是低估了国内的网速,下载了两天都下载完整版,所以直接下载github源码
https://github.com/xiongben-tongxue/openjdk/tree/jdk9/jdk9
##配置要求
这里需要查看common\doc\building.html
文件,查询环境配置要求
- GCC版本
Centos7默认版本的GCCs是4.8.5,所以需要升级一下版本这里我升级到了7
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
scl enable devtoolset-7 bash
which gcc
gcc --version
- Boot JDK
安装JDK8
sudo yum install java-1.8.0-openjdk-devel
编译过程
- bash configure
将下载好的压缩文件解压后,进行编译环境的检查
cd MyOpenJDK
bash configure
校验过程会提示你需要安装什么环境的包,安装提示一步一步下去就可以了
2. make images
环境没问题后就可以进行编译了
make images
这里会遇到一个问题
这个是c文件编译一个无法转换类型的问题,所修改一下这个文件,加入一行强转
最后无限的等待,大概2个小时后,编译完成,时间长短大概和我分配给虚拟机的配置比较低有关系
测试结果
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
- 编译java文件
build/linux-x86_64-normal-server-release/images/jdk/bin
2. 查看编译文件
这里需要切换到class文件目录下
查看编译文件的字节码文件,查看编译JDK的版本
这里看到编译环境的major version: 53
魔法号为53,正好是9版本的值
小结
这次编译JDK,从window折腾到ubuntu再到centos,其中折腾window环境最惨,熬夜到2点,解决掉环境问题,又发现编译过程中各种c文件编译问题,就放弃了,然后切换到ubuntu又发现下载源码各种慢,解决掉源码问题,就发现环境版本的问题,最后在centos编译成功
之前在网上各种资料,流程都比较简单描述,但实际却遇到各种问题,果然,纸上得来终觉浅