编译源码 ubuntu-JVM第1部分:编译OpenJdk14,我能做你也能做

本文内容过于硬核,建议有Java经验的人阅读。

1 序言

从上周开始就一直在看周志明的《深入理解Java虚拟机:JVM中级特性与最佳实践(第3版)》。 我很多年前就读过第二版,绝对算得上是国外JVM领域的专家了。 经典,值得读几遍。

本书一开始就介绍了如何自己编译JDK。 之前看书的时候就跳过了,自己还没操作过。 上周读到这里的时候,我突然有了实践的想法,我一说就做了。

首先,我这次选择了OpenJDK而不是OracleJDK。 OracleJDK会有一些独立的商业功能,而这些商业功能又不开源,所以我只能选择OpenJDK。

在开始编译之前,我也在网上查了很多资料。 所有的信息都表明我在基于Unix的系统上编译,即Linux或MacOS,但我是一个铁头。 上周在Windows10上从早上9点到12点都没有成功,所以我投降了。

由于囊中羞涩等诱因,我手里没有Mac笔记本,只能把目光投向Linux。

通常,此时可用的发行版是 CentOS 或 Ubuntu。 后来偶然听说有人推荐国内的Linux桌面版deepin。 之后我在笔记本上砍了128G空间,做了个双系统编译源码 ubuntu,正好在用。 尝试同时在该操作系统下编译OpenJDK。

2OpenJDK源码

首先,我使用的是deepin20社区版。

编译目标是OpenJDK14,也是最新的JDK版本。

OpenJDK的源码由Mercurial代码版本管理工具管理,可以直接从Repository获取源码:

hg clone https://hg.openjdk.java.net/jdk/jdk14
复制代码

而且就这样吧,国外做起来太慢了。 如果不进行单独的网络相关设置,等待所有克隆出来需要一个下午的时间,所以不建议这样做。 您可以直接访问代码仓库,使用 zip 下载形式直接下载代码包。

直接访问hg.openjdk.java.net/jdk/jdk14/,点击左侧的浏览,然后点击左侧的zip按钮即可下载。 我这里得到的下载地址是:

https://hg.openjdk.java.net/jdk/jdk14/archive/6c954123ee8d.zip
复制代码

不知道这个下载地址是否全年都有,暂时先不说。

zip压缩包下载完成后,我将完成第一步并获得OpenJDK14的源代码包。 在这个源码包下,有一个doc目录,上面有一个building.html。 这个文件实际上是一个编译指南,当编译出现问题时,可以到这个指南中寻找解决方案。

3 环境规划

编译JDK14需要一个叫做BootJDK的东西,这显然是目标JDK的以前的JDK版本。 比如我们要编译JDK14,本地就需要有JDK13的环境,所以首先要在本地安装JDK13。 下载地址:

http://jdk.java.net/java-se-ri/13
复制代码

下载完成后,解压并更改环境变量的配置。 Deepin系统的环境变量位于用户目录的.bashrc中。 由于我的系统是桌面版本,所以直接使用VSCode在文件末尾配置JDK13的环境变量:

export JAVA_HOME=/home/用户名/Java/jdk-13
export CLASSPATH=${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
复制代码

然后在命令行终端刷新配置文件:

source /home/用户名/.bashrc
复制代码

这时输入经典命令java-version即可查看版本信息:

openjdk version "13" 2019-09-17
OpenJDK Runtime Environment (build 13+33)
OpenJDK 64-Bit Server VM (build 13+33, mixed mode, sharing)
复制代码

然后就开始安装各种环境,为编译做准备。 由于需要安装的软件比较多,我把命令整理了一下放在下面:

sudo apt-get install build-essentail -y
sudo apt-get install libfreetype6-dev -y
sudo apt-get install libcups2-dev -y
sudo apt-get install libfontconfig1-dev -y
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev -y
sudo apt-get install libasound2-dev -y
sudo apt-get install libffi-dev -y
sudo apt-get install autoconf -y
复制代码

安装时,如果当前用户是root,则不需要在顶部添加sudo。 如果你不是 root,记得添加 sudo。 我习惯先打开终端,将用户切换到root。

这样就完成了规划工作,但是需要注意一点,执行完前面的命令后请检查gcc的版本,因为我们下载的源码包的文档中已经明确强调了gcc的版本限制,如果不是这个版本很可能会导致编译失败。

# 输入
gcc --version
# 输出
gcc (Uos 8.3.0.3-3+rebuild) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
复制代码

OpenJDK14所需的gcc版本是8.3.0。 请注意这一点,否则编译测试会通过,但打包镜像会失败(我在Ubuntu虚拟机上做实验时遇到过)。

这一段的含义是我们使用的gcc版本要求在4.8到8.3之间。 越接近8.3,就越接近成功。 言外之意就是我们最好使用8.3,否则很有可能会失败。

至此我们的编译环境就准备好了,连接好之后就可以开始编译了。

4 编译进行中

首先我们进入刚刚准备好的OpenJDK14源码包的根目录。 第一步,使用configure命令进行编译和检测。

配置命令承担多种职责,例如依赖性检测、参数配置和输出目录结构的创建。 如果编译过程中缺少所需的工具链或依赖项,命令执行后会给出清晰的提示,以及依赖安装命令。

我使用以下命令进行编译检测:

bash configure --enable-debug --with-jvm-variants=server
复制代码

该命令的含义是编译只包含Server模式的FastDebug版本的HotSpot虚拟机。

configure命令还有很多其他参数,我就不通过抄书的方式列出来了。 想了解的欢迎阅读书籍或者使用命令bashconfigure--help来查看。

收到后,我们在里面输入编译和检测命令。 如果检测通过,则会复制以下信息:

这里输出一些信息,包括调试级别、Java虚拟机的模式和特性、使用的编译器版本等配置摘要信息。

然后激动人心的时刻到来了。 最后一个命令其实很简单,makeimages。 执行完这个命令后,我们才真正开始了OpenJDK编译的过程。

你能做的就是喝杯茶。 。 。

再喝一杯茶。 。 。

再喝一杯茶。 。 。

。 。 。

第N杯茶后,编译成功。

我使用的是具有 16G 显存、CPU Celeron i7-8700 化学 6 和虚拟 12 核的台式计算机。 第一次完整编译大约需要 8 分钟。

如果已经完全编译,并且修改后增量编译编译源码 ubuntu,这样会快很多。 书中称10s内即可完成编译。 我没有尝试过,所以没有发言权。

编译成功后,我的OpenJDK14在build/linux-x86_64-server-fastdebug/jdk目录下,然后将系统的环境Java环境变量更改为我刚刚编译的OpenJDK,然后使用命令查看下一个版本:

# 输入
java -version
# 输出
openjdk version "14-internal" 2020-03-17
OpenJDK Runtime Environment (fastdebug build 14-internal+0-adhoc.weishiyao.jdk14-6c954123ee8d)
OpenJDK 64-Bit Server VM (fastdebug build 14-internal+0-adhoc.weishiyao.jdk14-6c954123ee8d, mixed mode)
复制代码

可以看到系统的jdk已经做成了我昨天自己编译的版本,连名字都做成了我的机器名。 连接上之后就可以使用自己编译的jdk了,还是蛮有成就感的。

最近写文章需要查看JVM源码。 有时候代码逻辑不是很清晰。 找了好久r源码 编译,趁着春节假期,抽空下载了OpenJDK13,搭建了JVM调试环境。 我把操作记录写在这篇文章里,供有需要的同学参考。 别踩坑。

我是在Ubuntu18.04下编译的,不是Windows下的。 建议不要在Windows下折腾,因为你遇到的问题会比Linux下多很多。 如果你的笔记本也是Windows的话,可以像我一样安装一个VMware虚拟机软件,在上面安装一个Ubuntu系统,在虚拟机上玩。 这两个软件可以从官方网站下载。 其实如果你懒得找,也可以在我的公众号后台回复中下载:虚拟机获取VMware软件和Ubuntu18.04镜像。

安装Ubuntu虚拟机本文不涉及,网上有相关资料。

开始

1.下载源码

我们平时使用的代码管理工具大多是Git。 OpenJDK不是,而是Mercurial管理工具,所以我们需要安装它。 使用以下命令安装。

sudo apt-get install mercurial

安装好代码管理工具后,我们就可以下载OpenJDK13的源码了,使用如下命令进行下载。 此过程取决于网络状况,所需时间也有所不同。 我花了大约十分钟才下载完毕。

hg clone http://hg.openjdk.java.net/jdk/jdk13/

嗯,我就这样等了十几分钟,因为具体的官方操作文档也在上面,我没有下载,看不懂,而且在上面也找不到Ubuntu 18编译OpenJDK13的相关文章互联网,所以我不知道要安装什么依赖项。 。 既然您看到了这篇文章,那么您就不必等待了。 步骤2和3不依赖源码,可以继续操作。

2.安装编译所需的依赖

这部分是查官方文档,做一下总结。 官方文档是通过软件来区分的。 一次输入一个命令有点繁琐,所以我们将其集成为一个命令并执行。 满足了一些想尽快编译的同学。 完成了,还有一些额外的东西。

sudo apt-get install libfreetype6-dev libcups2-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev libasound2-dev libffi-dev autoconf gcc clang libfontconfig1-dev

如果你想知道这个依赖软件是做什么用的,可以看一下官方文档。 文档的位置显示在右侧。

3、安装jdk12

这在文档中称为BootJDK,意思是需要以前版本的JDK作为编译的基础。 通常使用 N-1 版本。 例如编译OpenJDK8时r源码 编译,使用JDK7作为BootJDK。 我们这里编译的是OpenJDK13,所以使用JDK12。 也可以通过执行以下命令来完成。

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-12-jdk

安装后可以通过java-version验证安装是否成功。 看到下面的结果就ok了。

执行完前面的步骤后,恭喜你,现在可以开始编译了。

4. 检测配置

我们在里面安装了这么多东西,我们需要检查一下需要的软件是否已经安装了,用下面的命令来检查。

bash configure

如果执行过程中出现异常,只需按照异常和提示信息安装缺失的软件即可。 如果你看到下面的结果,再次恭喜你,所有依赖的软件都已经准备好了。

5.开始编译

最激动人心的时刻来了,输入下面的命令,开始编译。 这个过程大约需要半个小时,耐心等待,可以休息一下,喝一杯82年的奶茶。

make images

见证奇迹的照片。 看到右图说明编译成功。

6. 验证是否成功

需要更加稳定的去验证编译出来的java是否可用,通过下面的命令来验证。

./build/*/images/jdk/bin/java -version

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 编译源码 ubuntu-JVM第1部分:编译OpenJdk14,我能做你也能做 https://www.wkzy.net/game/139369.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务