Linux CentOS7虚拟机下编译Openjdk15

本文讲述了为何要自编译JDK源码,重点介绍了编译openjdk8的预备过程,包括选择合适的bootJDK、配置环境、解决编译过程中遇到的问题,如文件格式错误、依赖缺失等。通过实践掌握JVM实现的关键步骤。
摘要由CSDN通过智能技术生成

编译日志:

为什么要编译JDK源码

  1. 已发布jdk版本去除了调试信息和运行时信息,降低内存占用提升运行速度,但是不适合开发者调试jdk代码
  2. 深入jvm细节,自己动手编译为深入学习打基础

参考了几篇好的博客,想要深入了解JVM,就必须了解其实现机制。了解JVM实现的最好方法便是自己动手编译JDK。

我为什么要自己编译openjdk8以及那些坑

一、源码编译

平时使用的开发环境都是二进制安装包,是直接编译好的,但是这样的安装包不一定能满足所有的平台,所以做源码编译的目的就是:
1.满足不同的运行平台

2.方便定制满足不同的需求

3.方便运维

二、预备过程

1.修改内存

重安,磁盘大小,手动分区,推荐教程:https://www.cnblogs.com/jpwz/p/10466826.html

2.删除本机的openJDK

image-20210128115549823
通过命令:
rpm -qa | grep jdk

查看虚拟机上的JDK的版本号

img

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 是否安装成功

img

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 查看是否已满

解决:内存满了,扩展分区失败,分析了一下利弊,于是新建一个虚拟机。。

linux分区满了,如何进行扩容

img img

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

  1. 运行 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
img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值