300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 都2039年了 还不会编译JDK源码?这篇文章该看看了~~

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

时间:2021-09-05 04:14:51

相关推荐

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

文章目录

一、概述二、环境准备2.1 boot JDK2.2 编译机器及依赖 三、JDK源码下载四、编译过程4.1 上传并解压源码4.2 configure4.3.make all 五、验证六、使用编译后的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 -yyum install freetype-devel -yyum install alsa-lib-devel -y

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

三、JDK源码下载

访问官网地址,下载JDK源码包:

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

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

说明:本次演示使用的是JDK8的源码,另外下载源码也可以复制链接地址,在Linux主机上使用wget命令下载

四、编译过程

4.1 上传并解压源码

[root@softwares ~]# cp openjdk-8u41-src-b04-14_jan_.zip /usr/local/ #复制源码包到安装目录[root@softwares ~]# cd /usr/local/ #进入对应目录[root@softwares local]# unzip openjdk-8u41-src-b04-14_jan_.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会执行有一会儿,需要耐心等待,最终配置运行完毕后会提示如下信息

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

4.3.make all

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTs99XEG-1599926331894)(//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)(//08/08/AO9fzgFXD2ypKR5.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n98oxIsy-1599926331895)(//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 -versionopenjdk version "1.8.0-internal"OpenJDK Runtime Environment (build 1.8.0-internal-root__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上编译,毕竟思想都在上面了~~

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。