关于java:都2039年了还不会编译JDK源码这篇文章该看看了

32次阅读

共计 3214 个字符,预计需要花费 9 分钟才能阅读完成。

一、概述

你最难忘的经验是什么?如果让我来答复这个问题,那么我认为最后学习 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 上编译,毕竟思维都在下面了~~

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

正文完
 0