一、概述二、环境准备2.1 boot JDK2.2 编译机器及依赖三、JDK源码下载四、编译过程4.1 上传并解压源码4.2 configure4.3.make all五、验证六、使用编译后的jdk七、总结
一、概述你最难忘的经历是什么?如果让我来回答这个问题,那么我认为最初学习java的时候就是我最难忘的经历之一,记得那是一个电闪雷鸣,风雨交加的夜晚......嘟嘟嘟,哈哈开始跟着某视频写出了第一个hello world程序,当时那是一个开心啊~~;俗话说往事不堪回首啊,记得我刚开始学java的时候没有人指导我,或者说没有“先烈“指导我,导致我在那一段黑暗的学习过程中四处碰壁,没有养成很好的编程习惯,特别在学习基础的时候,从来没想过要看某一个API的源码,以至于在后面的很长一段时间里,都挂上了”api boy"的名号,长大了是要为小时候吹过的牛逼负责的,所以只能补咯。
言归正传,本篇文章通过手动编译JDK源码,带领大家熟悉整个编译过程,各位老铁可以根据编译的结果,在自己的项目中引入,自定义源码等等,废话少说撸就完了。
二、环境准备2.1 boot JDK在编译JDK源码之前,你的编译机器上必须要安装有JDK,官方称为boot JDK,例如你要编译JDK8的源码,那么你的编译机器上,必须包含JDK7或更新版本,至于为什么要搞这么个玩意儿,不是本篇文章的重点,以后的文章再分享。
我的理解是“鸡生蛋,蛋生鸡”的过程,编译过程需要JDK的一些工具支持
2.2 编译机器及依赖在编译JDK源码时最好使用Unix内核的系统,windows毕竟不是编译源码的主流操作系统环境,本文我主要采用CenOS7.x进行编译演示,在编译前,需要安装编译环境及一些必要的工具包:
yum install gcc -y #c或c 编译器 yum install libXtst-devel libXt-devel libXrender-devel -y #编译相关的依赖 yum install cups-devel -y yum install freetype-devel -y yum install alsa-lib-devel -y
说明:其实如果你不安装这些软件,在编译的configue环节也会失败,会提示你缺少哪些包,并附上安装命令,我就是一步一步找到我机器上缺少这些包的,关于这些依赖缺失导致报错截图,由于篇幅的问题笔者不会一个一个安排上,这也是为了给读者一个小悬念,引导读者自行去验证。
三、JDK源码下载访问官网地址,下载JDK源码包:
说明:本次演示使用的是JDK8的源码,另外下载源码也可以复制链接地址,在Linux主机上使用wget命令下载
四、编译过程4.1 上传并解压源码4.2 configure
[root@softwares ~]# cp openjdk-8u41-src-b04-14_jan_2020.zip /usr/local/ #复制源码包到安装目录 [root@softwares ~]# cd /usr/local/ #进入对应目录 [root@softwares local]# unzip openjdk-8u41-src-b04-14_jan_2020.zip ##解压到当前目录 [root@softwares local]# ln -s openjdk8source ./openjdk ##添加软链接
[root@softwares ~]# cd /usr/local/ #进入目录 [root@softwares local]# cd openjdk8source/ #进入解压后的目录 [root@softwares openjdk8source]# chown u x configure #添加confiure文件的执行权限 [root@softwares openjdk8source]# ./configure #运行configure
说明:configure文件默认是没有执行权限,需要手动授予。
遇坑指南:./configure运行了几次才成功,原因是缺少依赖,每次configure失败最后都会提示你缺少什么东西,安装命令是什么,如下图,文章2.2小结中提到的怎么获取机器上缺失的软件包,正是在这一步找到的。
configure会执行有一会儿,需要耐心等待,最终配置运行完毕后会提示如下信息
4.3.make all
在4.2执行成功后接着就是编译,直接运行make all命令,我这里是一次性过,编译耗时几分钟,但是中途没报其它错误。
说明:关于configure和make过程,如果有Linux运维经验,或C/C 开发经验的小伙伴应该会知道,configure过程通过模板生成编译的配置文件MakeFile,make过程其实就是根据makefile文件进行编译,将编译结果输出到指定文件中,configure过程也可以手动指明一下配置参数,对于Linux下如何编译源码包的过程,笔者将会在接下来的文章输出。
五、验证还记得在configure完毕后,最后提示的路径么(如果不记得看上图4.2小节的图2),没错,那正式编译的文件存放路径:
/usr/local/openjdk/build/linux-x86_64-normal-server-release
jdk及jre编译后的文件目录:
看到这里,说明你已经把整个编译过程都看了一遍了,接下来就亲自在自己的项目中引入一下成果。
六、使用编译后的jdk使用编译后的JDK运行第一个 hello world 程序
[root@softwares ~]# vim Test.java public class Test{ public static void main(String args[]){ System.out.println("hello world!"); } }
切换JDK环境变量,并运行程序
1.切换环境变量为自己编译后的JDK: vim /etc/profile.d/jdk.sh 添加内容 export JAVA_HOME=/usr/local/openjdk/build/linux-x86_64-normal-server-release/images/j2sdk-image export PATH=$JAVA_HOME/bin:$PATH 生效 [root@softwares ~]# source /etc/profile #让shell程序重读环境变量配置 2.检查环境变量是否生效 [root@softwares ~]# java -version openjdk version "1.8.0-internal" OpenJDK Runtime Environment (build 1.8.0-internal-root_2020_08_08_17_50-b00) ##出现这句说明环境变量已经切换过来了 OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode) 2.编译: [root@softwares ~]# javac ./Test.java 3.运行: [root@softwares ~]# java Test #运行不用加文件后缀 hello world! #能正常运行
定制JDK
如果你有定制JDK某些类或方法(增删改)的需求,需要在解压后的源码目录下进行修改,源码目录位于:
/usr/local/openjdk/jdk/src/share/
修改后需要重新编译JDK源码,最后拿到编译后的JDK源码就具有你扩展的功能啦~~没错简历知道怎么写了吧?精通JDK的二次开发,哈哈开个玩笑~
七、总结说到这里哈,有朋友就会问,老哥我平时码代码的时候都是在window工作的,你用Unix内核的系统给我编译出来的玩意能在window上运行么?回答肯定是不行的,还记得java为什么能跨平台么?没错不是java能跨平台,而是JVM的实现是基于不同平台的,那就意味着,不同平台编译出来的JDK只能在对应平台上运行,JVM根据不同平台翻译为对应的机器码,JVM才是java能跨平台的基石;那么window平台的码友就不好意思了,只能自己尝试在window上编译,毕竟思想都在上面了~~
好了本期就先到这里,我们下期见,拜拜~
,