都2039年了,还不会编译JDK源码?这篇文章该看看了~~

码农天地 -
都2039年了,还不会编译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 上传并解压源码

[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 ##添加软链接

4.2 configure

[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上编译,毕竟思想都在上面了~~

好了本期就先到这里,我们下期见,拜拜~

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg