1.概述一下你最难忘的经历是什么?如果让我来回答这个问题,那我觉得第一次学java是我最难忘的经历之一,我记得那是一个电闪雷鸣,风雨兼程的夜晚。。。哔哔,哈哈开始了跟着某视频写了第一个helloworld程序,当时很开心~~;俗话说,往事不堪。记得刚开始学习java的时候,没有人指导我,或者说没有“先烈”来指导我。结果那段暗学习碰壁了,没有养成良好的编程习惯。尤其是在学习基础的时候,从来没有想过要看某个API的源码,这样以后才能长期使用。在这里,“api小子”的称号全都挂在了上面。等我长大了,要为小时候吹嘘的牛逼负责,只能弥补。言归正传,本文通过手动编译JDK源码的方式,引导大家熟悉整个编译过程。大家可以根据编译结果引入到自己的项目中,自定义源码等等,废话少说。2.环境准备2.1bootJDK在编译JDK源码之前,你的编译机器上必须安装JDK,官方称之为bootJDK。比如你要编译JDK8的源码,你的编译机必须有JDK7或者更高的版本,至于为什么要做这样的事情,不是本文的重点,我会在以后的文章中分享.我的理解是“鸡下蛋,鸡下蛋”的过程。编译过程需要一些JDK工具支持2.2的编译机和依赖。编译JDK源代码时最好使用Unix内核系统。毕竟windows不是编译源码的主流操作。系统环境。在这篇文章中,我主要使用CenOS7.x来编译和演示。编译前需要安装编译环境和一些必要的工具包:yuminstallgcc++-y#c或c++编译器yuminstalllibXtst-devellibXt-devellibXrender-devel-y#编译相关依赖yuminstallcups-devel-yyuminstallfreetype-devel-yyuminstallalsa-lib-devel-y说明:其实如果不安装这些软件,编译的configue链接也会失败。它会提醒你缺少哪些包,并附上安装命令。我一步一步地找到了我的机器上缺少的这些包。关于这些缺失依赖的截图,我就不一一整理了。这也是为了给读者一点悬念,引导读者自己去验证。3、JDK源码下载访问官网地址,下载JDK源码包:注:本演示使用JDK8的源码。另外,也可以复制链接地址下载源码,在linux主机上使用wget命令下载。4.编译过程4.1上传上传解压源码[root@softwares~]#cpopenjdk-8u41-src-b04-14_jan_2020.zip/usr/local/#将源码包复制到安装目录下[root@softwares~]#cd/usr/local/#进入对应目录[root@softwareslocal]#unzipopenjdk-8u41-src-b04-14_jan_2020.zip##解压到当前目录[root@softwareslocal]#ln-sopenjdk8source./openjdk##添加软链接4.2configure[root@softwares~]#cd/usr/local/#进入目录[root@softwareslocal]#cdopenjdk8source/#进入解压目录[root@softwaresopenjdk8source]#chownu+xconfigure#添加confiure文件的执行权限[root@softwaresopenjdk8source]#./configure#configure运行说明:configure文件默认没有执行权限,需要手动授予。遇到指南:./configure跑了好几次才成功,因为缺少依赖。每次configure失败都会提示你缺少什么,安装命令是什么。就是在这一步找到丢失的包。configure会执行一段时间,需要耐心等待。最后配置完成后,会提示如下信息,但中途没有报其他错误。注意:关于configure和make过程,如果有Linux运维经验,或者有C/C++开发经验的应该知道,configure过程是通过模板生成编译后的配置文件MakeFile,而make过程实际上是编译根据生成文件。编译结果输出到指定文件。配置过程也可以手动指定配置参数。对于Linux下编译源码包的过程,笔者会在下一篇文章中进行输出。5、验证一下configure完成后,是否还记得最后提示的路径(不记得可以看上面4.2节的图2),是的,官方编译好的文件存放路径:/usr/local/openjdk/build/linux-x86_64-normal-server-releasejdk和jre编译文件目录:看到这里,说明你已经看完了整个编译过程,接下来在自己的项目中引入结果。6.使用编译好的JDK运行第一个使用编译的JDK的helloworld程序[root@softwares~]#vimTest.javapublicclassTest{publicstaticvoidmain(Stringargs[]){System.out.println("你好世界!”);}切换JDK环境变量并运行程序1.将环境变量切换为自己编译的JDK:vim/etc/profile.d/jdk.sh添加内容exportJAVA_HOME=/usr/local/openjdk/build/linux-x86_64-normal-server-release/images/j2sdk-imageexportPATH=$JAVA_HOME/bin:$PATH生效[root@softwares~]#source/etc/profile#让shell程序重新读取环境变量配置2.检查环境变量是否有效[root@softwares~]#java-versionopenjdkversion"1.8.0-internal"OpenJDKRuntimeEnvironment(build1.8.0-internal-root_2020_08_08_17_50-b00)##这句话出现环境变量有已切换到OpenJDK64位服务器VM(构建25.40-b25,混合模式)2.编译:[root@softwares~]#javac./Test.java3.运行:[root@softwares~]#javaTest#No需要添加文件后缀才能运行helloworld!#可以正常运行自定义JDK如果需要自定义JDK的一些类或方法(增删改查),需要在解压后的源码目录下进行修改。源码目录位于:/usr/local/openjdk/jdk/src/share/修改后需要重新编译JDK源码,最后得到编译好的JDK源码才有你的扩展功能~~是的,你知道怎么写你的简历,对吗?精通JDK二次开发,哈哈开玩笑~7.总结说到这里,有朋友会问了,兄弟,我平时写代码都是在windows下工作的,你给我用Unix内核系统编译出来的东西能在windows上运行么?答案肯定是否定的,还记得java为什么可以跨平台吗?没错,不是java可以跨平台,而是JVM的实现驻留在不同的平台上,也就是说不同平台编译的JDK只能运行在相应的平台上,JVM翻译成相应的机器代码根据不同的平台。是java跨平台的基石;那么window平台的码友就尴尬了,只能自己尝试在window上编译了,毕竟心思都在上面了~~那这个issue就先到这里吧,我们下期见下期再见~
