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

一、概述

​ 本篇文章通过手动编译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源码包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCOw9ev6-1599926331886)(https://i.loli.net/2020/08/08/wnJfMu8KsUbdY72.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DTgbulu4-1599926331888)(https://i.loli.net/2020/08/08/xeERvAqopG6m3Yc.png)]

说明:本次演示使用的是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文件默认是没有执行权限,需要手动授予。

image-20200808174825554

遇坑指南:./configure运行了几次才成功,原因是缺少依赖,每次configure失败最后都会提示你缺少什么东西,安装命令是什么,如下图,文章2.2小结中提到的怎么获取机器上缺失的软件包,正是在这一步找到的。

image-20200808174441782

configure会执行有一会儿,需要耐心等待,最终配置运行完毕后会提示如下信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyGyPe7C-1599926331893)(https://i.loli.net/2020/08/08/ZTVA2Cc1HUdb9fP.png)]

4.3.make all

在4.2执行成功后接着就是编译,直接运行make all命令,我这里是一次性过,编译耗时几分钟,但是中途没报其它错误。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTs99XEG-1599926331894)(https://i.loli.net/2020/08/08/7UkqDHn1jSuxC9g.png)]

说明:关于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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRaBYDPg-1599926331894)(https://i.loli.net/2020/08/08/AO9fzgFXD2ypKR5.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-im4V6iiw-1599926331895)(https://i.loli.net/2020/08/08/JupAt5e2Bm4ikzn.png)]

jdk及jre编译后的文件目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n98oxIsy-1599926331895)(https://i.loli.net/2020/08/08/8Bck5VenvwSm2st.png)]

看到这里,说明你已经把整个编译过程都看了一遍了,接下来就亲自在自己的项目中引入一下成果。

六、使用编译后的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源码就具有你扩展的功能啦。

七、总结

说到这里哈,有朋友就会问,老哥我平时码代码的时候都是在window工作的,你用Unix内核的系统给我编译出来的玩意能在window上运行么?回答肯定是不行的,还记得java为什么能跨平台么?没错不是java能跨平台,而是JVM的实现是居于不同平台的,那就意味着,不同平台编译出来的JDK只能在对应平台上运行,JVM根据不同平台翻译为对应的机器码,JVM才是java能跨平台的基石;那么window平台的码友就不好意思了,只能自己尝试在window上编译,毕竟思想都在上面了~~

什么能跨平台么?没错不是java能跨平台,而是JVM的实现是居于不同平台的,那就意味着,不同平台编译出来的JDK只能在对应平台上运行,JVM根据不同平台翻译为对应的机器码,JVM才是java能跨平台的基石;那么window平台的码友就不好意思了,只能自己尝试在window上编译,毕竟思想都在上面了~~

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值