Linux下手动编译JDK8源码~~安排!

Posted 精品技术队列

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下手动编译JDK8源码~~安排!相关的知识,希望对你有一定的参考价值。

一、概述

你最难忘的经历是什么?如果让我来回答这个问题,那么我认为最初学习 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 -yyum install freetype-devel -yyum install alsa-lib-devel -y

说明:其实如果你不安装这些软件,在编译的 configue 环节也会失败,会提示你缺少哪些包,并附上安装命令,我就是一步一步找到我机器上缺少这些包的,关于这些依赖缺失导致报错截图,由于篇幅的问题笔者不会一个一个安排上,这也是为了给读者一个小悬念,引导读者自行去验证。

三、JDK 源码下载

Linux下手动编译JDK8源码~~安排!

四、编译过程

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 文件默认是没有执行权限,需要手动授予。

Linux下手动编译JDK8源码~~安排!

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

Linux下手动编译JDK8源码~~安排!

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

Linux下手动编译JDK8源码~~安排!

4.3.make all

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

Linux下手动编译JDK8源码~~安排!

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

Linux下手动编译JDK8源码~~安排!

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

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

六、使用编译后的 jdk

使用编译后的 JDK 运行第一个 hello world 程序

[root@softwares ~]# vim Test.javapublic 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-imageexport PATH=$JAVA_HOME/bin:$PATH生效[root@softwares ~]# source /etc/profile #让shell程序重读环境变量配置
2.检查环境变量是否生效[root@softwares ~]# java -versionopenjdk 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 上编译,毕竟思想都在上面了~~

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



以上是关于Linux下手动编译JDK8源码~~安排!的主要内容,如果未能解决你的问题,请参考以下文章

linux安装jdk8

linux—vmare下手动编译二进制文件装vmtool

怎么卸载源码编译安装的软件

linux下如何编译源码包或者说是安装

170502linux下配置jdk8

linux软件管理之------编译安装nginx服务器并手动编写自动化运行脚本