Ubuntu下编译OpenJDK 16

3/21/2021 OpenJDK

# 介绍

JDK是一个复杂的软件项目。 构建它需要一定的技术,相当数量的对外部软件的依赖关系以及相当强大的硬件。 如果您只是想使用JDK而不是自己构建它,那么本文不适合您。 有关安装预构建好不同平台的JDK的一些方法,请参见例如OpenJDK安装 (opens new window)

# 流程预览

  1. 获取源代码

    git clone https://git.openjdk.java.net/jdk/
    
    1
  2. 进行配置检查

    bash configure
    
    1

    如果由于缺少相关性(对工具链,构建工具,外部库或引导JDK)而导致配置失败,则大多数情况下它会提出有关如何解决平台问题的建议。 按照说明进行操作,然后尝试再次运行bash configure。

  3. 进行编译

    make images
    
    1
  4. 验证新构建的JDK

    ./build/*/images/jdk/bin/java -version
    
    1
  5. 运行基本测试

    make run-test-tier1
    
    1

看起来虽然并不复杂,但是实际上只看这个的话会有很多错误

# 获取源代码

此次编译的版本是jdk16u repo (opens new window)

git clone https://github.com/openjdk/jdk16u.git
1

一些建议

  • 使用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
1

# 外部库

缺少一些外部库会在配置时直接出错,这里按照文档建议下载了这些库

FreeType

sudo apt-get install libfreetype6-dev
1

如果配置时出错考虑主动指定参数 --with-freetype-include=<path> & --with-freetype-lib=<path>

CUPS

sudo apt-get install libcups2-dev
1

如果配置时出错考虑主动指定参数 --with-cups=<path>

X11

sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
1

如果配置时出错考虑主动指定参数 --with-x=<path>

ALSA

sudo apt-get install libasound2-dev
1

如果配置时出错考虑主动指定参数 --with-alsa=<path>

libffi

sudo apt-get install libffi-dev
1

如果配置时出错考虑主动指定参数 --with-libffi=<path>

# 构建工具

同样的,还会依赖下面这些构建工具,所以继续下载

Autoconf

sudo apt-get install autoconf
1

配置出错时考虑 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>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
1
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>

本软件是自由软件,您可以自由地更改和重新发布。
在法律许可的情况下特此明示,本软件不提供任何担保。
1
2
3
4
5
6

# 进行配置

这里的配置指定了参数,表示编译64位的JDK,并指定了启动JDK的目录(没指定之前出现了错误...)

sudo bash configure --with-target-bits=64 --with-boot-jdk=/usr/local/jdk-15.0.2/
1

编译过程中碰到亿个错误,但是基本可以根据提示进行解决,不行就百度。

比如没有fontconfig,百度后使用了apt进行安装,之后就成功了。

sudo apt-get install libfontconfig1-dev
1

问题解决后看到

====================================================
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
1
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
1

然后就可以去喝杯Java了 - -

Finished building target 'default (exploded-image)' in configuration 'linux-x86_64-server-release'
1

可以看到编译完成了,使用以下命令检查一下

build/linux-x86_64-server-release/jdk/bin/java --version
1

发现可以正常使用,至此编译结束

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)
1
2
3

之后可以新建一个Test.java文件测试一下

public class Test{
    public static void main(String[]args){
        system.out.println("Hello World!");
    }
}
1
2
3
4
5

然后进入到编译之后的JDK的目录调用sudo ./javac Test.javasudo ./java Test 测试一下,能输出就没啥问题了

使用./是为了防止使用系统环境变量的JDK

Hello World!
1

# 最后

JDK的构建至此便告一段落。说一下为什么突然想编译JDK,其实是前些天略读了一遍深入理解Java虚拟机,作者建议可以尝试一下,正好也觉得挺有趣的,所以就编译了一次。因为书是第二版(二手),JDK版本比较老,所以整个过程都是跟着官方文档走的,也百度了很多配置时出现的错误,强烈推荐大家看官方文档,虽然是英文,但是确实非常详细,包括后面还有交叉编译,测试JDK的环节等,因个人才疏学浅,所以也没有再进一步进行,感兴趣的直接去OpenJDK (opens new window)官方网站查看即可。最后提醒一下,这个JDK 16已经是GA了,就在本文发布的前几天 - -