Ubuntu下编译OpenJDK 16
# 介绍
JDK是一个复杂的软件项目。 构建它需要一定的技术,相当数量的对外部软件的依赖关系以及相当强大的硬件。 如果您只是想使用JDK而不是自己构建它,那么本文不适合您。 有关安装预构建好不同平台的JDK的一些方法,请参见例如OpenJDK安装 (opens new window)。
# 流程预览
获取源代码
git clone https://git.openjdk.java.net/jdk/
1进行配置检查
bash configure
1如果由于缺少相关性(对工具链,构建工具,外部库或引导JDK)而导致配置失败,则大多数情况下它会提出有关如何解决平台问题的建议。 按照说明进行操作,然后尝试再次运行bash configure。
进行编译
make images
1验证新构建的JDK
./build/*/images/jdk/bin/java -version
1运行基本测试
make run-test-tier1
1
看起来虽然并不复杂,但是实际上只看这个的话会有很多错误
# 获取源代码
此次编译的版本是jdk16u repo (opens new window)
git clone https://github.com/openjdk/jdk16u.git
一些建议
- 使用Linux可以避免很多问题(测试环境Ubuntu 20.04)
- 不要让路径包含中文,空格符,或者目录很深,以免带来不必要的麻烦
- 建议在SSD上进行编译
- 建议8核CPU及8G以上内存
# Boot JDK
构建JDK需要一个预先存在的JDK。 这称为“启动JDK”。
经验法则是,推荐Boot JDK的版本为N-1,
所以这里下载OpenJDK 15作为Boot JDK
sudo apt-get install openjdk-15-jdk
# 外部库
缺少一些外部库会在配置时直接出错,这里按照文档建议下载了这些库
FreeType
sudo apt-get install libfreetype6-dev
如果配置时出错考虑主动指定参数 --with-freetype-include=<path>
& --with-freetype-lib=<path>
CUPS
sudo apt-get install libcups2-dev
如果配置时出错考虑主动指定参数 --with-cups=<path>
X11
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
如果配置时出错考虑主动指定参数 --with-x=<path>
ALSA
sudo apt-get install libasound2-dev
如果配置时出错考虑主动指定参数 --with-alsa=<path>
libffi
sudo apt-get install libffi-dev
如果配置时出错考虑主动指定参数 --with-libffi=<path>
# 构建工具
同样的,还会依赖下面这些构建工具,所以继续下载
Autoconf
sudo apt-get install autoconf
配置出错时考虑 AUTOCONF=<path to autoconf> configure ...
GNU Make
至少需要3.81版本以后的GNU Make
强烈推荐4.0以上
通过make --version
即可查看,显示默认就是4.2.1,所以不用进行操作。
GNU Make 4.2.1
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2016 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
2
3
4
5
6
GNU Bash
必须使用GNU Bash,且版本至少3.2
同样的,通过bash --version
查看,发现是5.0.17,所以继续跳过。
GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证第三版或者更新版本 <http://gnu.org/licenses/gpl.html>
本软件是自由软件,您可以自由地更改和重新发布。
在法律许可的情况下特此明示,本软件不提供任何担保。
2
3
4
5
6
# 进行配置
这里的配置指定了参数,表示编译64位的JDK,并指定了启动JDK的目录(没指定之前出现了错误...)
sudo bash configure --with-target-bits=64 --with-boot-jdk=/usr/local/jdk-15.0.2/
编译过程中碰到亿个错误,但是基本可以根据提示进行解决,不行就百度。
比如没有fontconfig,百度后使用了apt进行安装,之后就成功了。
sudo apt-get install libfontconfig1-dev
问题解决后看到
====================================================
A new configuration has been successfully created in
/home/alightyoung/Desktop/jdk16u/build/linux-x86_64-server-release
using configure arguments '--with-target-bits=64 --with-boot-jdk=/usr/local/jdk-15.0.2/'.
Configuration summary:
* Name: linux-x86_64-server-release
* Debug level: release
* HS debug level: product
* JVM variants: server
* JVM features: server: 'aot cds compiler1 compiler2 epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs zgc'
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 16-internal+0-adhoc.root.jdk16u (16-internal)
Tools summary:
* Boot JDK: openjdk version "15.0.2" 2021-01-19 OpenJDK Runtime Environment (build 15.0.2+7-27) OpenJDK 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing) (at /usr/local/jdk-15.0.2)
* Toolchain: gcc (GNU Compiler Collection)
* C Compiler: Version 9.3.0 (at /usr/bin/gcc)
* C++ Compiler: Version 9.3.0 (at /usr/bin/g++)
Build performance summary:
* Cores to use: 15
* Memory limit: 15440 MB
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
OK!配置至此结束,需要不同版本的JDK可以看看配置参数进行修改,配置参数在官方文档介绍的十分详细,官方文档 (opens new window)
# 进行编译
配置正确之后,就可以进行编译了。
当使用make
不加任何参数时,等同于make default
或者make jdk
,这将会构建一个尽量最小的镜像。编译后的镜像会放在build
目录下
这里我们就按默认进行编译即可
make
然后就可以去喝杯Java了 - -
Finished building target 'default (exploded-image)' in configuration 'linux-x86_64-server-release'
可以看到编译完成了,使用以下命令检查一下
build/linux-x86_64-server-release/jdk/bin/java --version
发现可以正常使用,至此编译结束
openjdk 16-internal 2021-03-16
OpenJDK Runtime Environment (build 16-internal+0-adhoc.root.jdk16u)
OpenJDK 64-Bit Server VM (build 16-internal+0-adhoc.root.jdk16u, mixed mode)
2
3
之后可以新建一个Test.java文件测试一下
public class Test{
public static void main(String[]args){
system.out.println("Hello World!");
}
}
2
3
4
5
然后进入到编译之后的JDK的目录调用sudo ./javac Test.java
和sudo ./java Test
测试一下,能输出就没啥问题了
使用
./
是为了防止使用系统环境变量的JDK
Hello World!
# 最后
JDK的构建至此便告一段落。说一下为什么突然想编译JDK,其实是前些天略读了一遍深入理解Java虚拟机,作者建议可以尝试一下,正好也觉得挺有趣的,所以就编译了一次。因为书是第二版(二手),JDK版本比较老,所以整个过程都是跟着官方文档走的,也百度了很多配置时出现的错误,强烈推荐大家看官方文档,虽然是英文,但是确实非常详细,包括后面还有交叉编译,测试JDK的环节等,因个人才疏学浅,所以也没有再进一步进行,感兴趣的直接去OpenJDK (opens new window)官方网站查看即可。最后提醒一下,这个JDK 16已经是GA了,就在本文发布的前几天 - -