作为JAVA开发者,JDK一定天天都会用到,所以想这周编译一下JDK源码,项目一直在使用JDK8,所以可以编译JDK9,这里的JDK指的是openJDK,每个版本的JDK编译都需要一个Boot JDK(可以参考building.html中编译指南),比如JDK9,就需要JDK8

openJDK做为GPL许可(GPL-licensed)的Java平台的开源化实现

环境准备

  1. CentOS7 64位

  2. Openjdk version "1.8.0_272"

系统选择

  1. 非常不建议在window环境下折腾编译JDK,window环境需要安装Cygwin64、visual Studio的c环境jdk,然后./configure会出现各种你想象不到问题,需要修改检验文件,环境校验过了,也会出现编译的问题
  2. 其实一开始我在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

下载源码

  1. JDK的源码下载需要安装mercurial
    yum install mercurial
  2. 下载源码
    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文件,查询环境配置要求

  1. GCC版本
    image.png
    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
  1. Boot JDK
    image.png
    安装JDK8
    sudo yum install java-1.8.0-openjdk-devel

编译过程

  1. bash configure
    将下载好的压缩文件解压后,进行编译环境的检查
cd MyOpenJDK
bash configure 

校验过程会提示你需要安装什么环境的包,安装提示一步一步下去就可以了

image.png
2. make images
环境没问题后就可以进行编译了

make images

这里会遇到一个问题
image.png

这个是c文件编译一个无法转换类型的问题,所修改一下这个文件,加入一行强转
image.png

最后无限的等待,大概2个小时后,编译完成,时间长短大概和我分配给虚拟机的配置比较低有关系

image.png

测试结果

public class HelloWorld{
	public static void main(String[] args){
		System.out.println("Hello, World!");
	}
}
  1. 编译java文件
build/linux-x86_64-normal-server-release/images/jdk/bin

image.png
2. 查看编译文件
这里需要切换到class文件目录下

image.png
查看编译文件的字节码文件,查看编译JDK的版本
这里看到编译环境的major version: 53
image.png
魔法号为53,正好是9版本的值

小结

这次编译JDK,从window折腾到ubuntu再到centos,其中折腾window环境最惨,熬夜到2点,解决掉环境问题,又发现编译过程中各种c文件编译问题,就放弃了,然后切换到ubuntu又发现下载源码各种慢,解决掉源码问题,就发现环境版本的问题,最后在centos编译成功
之前在网上各种资料,流程都比较简单描述,但实际却遇到各种问题,果然,纸上得来终觉浅