编译日志:
为什么要编译JDK源码
- 已发布jdk版本去除了调试信息和运行时信息,降低内存占用提升运行速度,但是不适合开发者调试jdk代码
- 深入jvm细节,自己动手编译为深入学习打基础
参考了几篇好的博客,想要深入了解JVM,就必须了解其实现机制。了解JVM实现的最好方法便是自己动手编译JDK。
一、源码编译
平时使用的开发环境都是二进制安装包,是直接编译好的,但是这样的安装包不一定能满足所有的平台,所以做源码编译的目的就是:
1.满足不同的运行平台
2.方便定制满足不同的需求
3.方便运维
二、预备过程
1.修改内存
重安,磁盘大小,手动分区,推荐教程:https://www.cnblogs.com/jpwz/p/10466826.html
2.删除本机的openJDK
通过命令:
rpm -qa | grep jdk
查看虚拟机上的JDK的版本号
3.bootJDK (Linux安装jdk14)
Paradoxically, building the JDK requires a pre-existing JDK. This is called the "boot JDK". The boot JDK does not, however, have to be a JDK built directly from the source code available in the OpenJDK Community. If you are porting the JDK to a new platform, chances are that there already exists another JDK for that platform that is usable as boot JDK.
The rule of thumb is that the boot JDK for building JDK major version N should be a JDK of major version N-1, so for building JDK 9 a JDK 8 would be suitable as boot JDK. However, the JDK should be able to "build itself", so an up-to-date build of the current JDK source is an acceptable alternative. If you are following the N-1 rule, make sure you've got the latest update version, since JDK 8 GA might not be able to build JDK 9 on all platforms.
Early in the release cycle, version N-1 may not yet have been released. In that case, the preferred boot JDK will be version N-2 until version N-1 is available.
If the boot JDK is not automatically detected, or the wrong JDK is picked, use --with-boot-jdk to point to the JDK to use.
大致意思:
构建JDK需要一个预先存在的JDK。 这称为“启动JDK“
用于构建JDK主版本N的引导JDK应该是主版本N-1的JDK,因此,对于构建JDK 9,JDK 8将适合作为引导JDK。
1.安装bootJDK,在编译openJDK之前需要一个启动jdk,也就是我们一般用安装包安装的JDK,也就是OracleJDK,选择bootJDK一般选择比openJDK前一个版本的JDK,也可以选择更高版本的JDK,将相应的.tar.gz文件传入
2.解压bootJDK
3.配置bootJDK环境
set java environment
JAVA_HOME=/usr/java/jdk-14.0.2
JRE_HOME=/usr/java/jdk-14.0.2/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
通过 source /etc/profile 命令使更改的配置立即生效
通过 java -version 命令和 javac -version 命令来查看 jdk 是否安装成功
4.这里在之后的编译中会遇到一个问题就是在JDK9之后的JDK解压出来之后是没有JRE和两个.jar包的那么此时,最简单的解决方法,
<一> 就是将一个JDK8的压缩包传入,然后将其中的JRE粘贴到JDK根目录,将rt.jar和tools.jar粘贴到lib目录下
这样我们就规避报错
<二> 继续在openjdk12的源码文件夹下执行make images命令。
报错显示缺少jre文件和在lib中缺少tools.jr和dt.jar
通过xftp将缺少的文件传入。(直接使用jdk1.8的相关文件传入即可)
通过命令检查 java -version
三、开始编译
1、解压
问题一:
bash-4.2# cd /usr/java
bash-4.2# tar -zxvf openjdk-15.0.2_linux-x64_bin.tar.gz
报错信息:
tar (child): openjdk-15.0.2_linux-x64_bin.tar:无法 open: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
原因:解压一个/home/user/*.tgz的文件时,使用tar -zxvf *.tgz,注意格式.gz
(1)是否因帐号权限不足造成的,建议用sudo执行
(2)原tar包损坏
(3)可能磁盘空间不足,df /usr/java -h 查看是否已满
解决:内存满了,扩展分区失败,分析了一下利弊,于是新建一个虚拟机。。
cd到openJDK的根目录下
通过命令下载相应的依赖包:
sudo yum -y groupinstall "Development Tools "sudo yum -y install freetype-develsudo yum -y install cups-devel
sudo yum -y install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-develsudo yum install -y libasound2-dev
sudo yum install -y libffi-dev
sudo yum install -y autoconf
2、运行命令:
bash configure
- 运行
configure
脚本, 检测编译环境是否合格
bash ./configure
./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本
在运行的过程中还会出现两个依赖没有下载好的情况,根据命令提示(直接将提示引号中的粘贴复制即可)下载好相应的依赖包之后,继续运行bash configure即可
问题二:
bash:./configure:No such file or directory
原因:
1、在配置指定路径时没有这样的文件或目录存在,先创建一个目录。
2、可能现在执行的目录下没有configure 程序,你无法执行,你到configure所在目录下重新执行语句就可以了。
解决:少安了,发现也不行。。。
sudo yum install fontconfig-devel
sudo yum -y install cups-devel
yum install alsa-lib-devel
yum install -y libffi libffi-devel
sudo yum groupinstall "Development Tools"
sudo yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel
sudo yum install fontconfig-devel
查找资料:有的软件包并不是用makefile的,或者makefile已经写好,不用config了,因此不提供configure。你可以看文件夹里是否有makefile文件,若有,可以直接使用make编译,make install安装;如果没有,看是否有setup、install等sh文件或其它可执行文件。还有一种情况,这个软件解压即可运行。
3.运行 make
命令, 编译JDK
make images
如果你想编译出 JDK JRE 的那套二进制的话,请运行
make images
make 是用来编译的,它从Makefile中读取指令,然后编译;
make clean:清除编译产生的可执行文件及目标文件(object file,*.o), 如果编译失败,执行这个命令。
多次尝试先
make clean
后开始编译,运行命令
make images
这里的话编译的时间大约是二十分钟左右,这个看个人电脑的cpu的情况,一般情况下虚拟机不会出现卡顿的现象,所以如果你发现的虚拟机在一个命令处不动了,那么耐心多等待一会儿
问题三:
make: *** 没有规则可以创建目标“images”。 停止。
make clean 和make distclean的区别:
make clean仅仅是清除之前编译的可执行文件及配置文件。
而make distclean要清除所有生成的文件
make distclean类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。
解决:创建目标,编写makefile,太麻烦了。。。。
4、设置openJDK的环境变量
同jdk
最后ok