ubuntu编译JDK12

984 阅读3分钟

近期在看周志明大神的《深入理解Java虚拟机》这本书,在书中提到了编译自己的JDK,因此前来实践一下

前期准备

ubuntu 18.04.1

我采用的是ubuntu 18.04.1 LTS,是运行在vmware虚拟机中的

openjdk 12

获取openjdk有两种方式:

第一种

进入到openjdk 12官网,通过下载zip包方式获取

# openjdk 12 官网地址
https://hg.openjdk.java.net/jdk/jdk12

点击左侧zip按钮下载zip包

第二种

直接使用hg命令进行克隆

hg clone https://hg.openjdk.java.net/jdk/jdk12

hg命令在ubuntu中并没有预安装,需要手动安装

sudo apt-get install mercurial

下载后的目录结构

GCC

sudo apt-get update
sudo apt-get install build-essential

FreeType

为什么要用到FreeType呢,其实就需要从OpenJDK和Oracle JDK的区别说起了。Oracle JDK在字体栅格化渲染上采用的商业实现,所以无权放给OpenJDK进行开源,而OpenJDK在这块则采用了同样开源的FreeType代替

sudo apt-get install libfreetype6-dev

CUPS

sudo apt-get install libcups2-dev

X11

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

ALSA

sudo apt-get install libasound2-dev

libffi

sudo apt-get install libffi-dev

Autoconf

sudo apt-get install autoconf

JDK N-1

最后,假设要编译大版本号为N的JDK,我们还要准备一个大版本号至少为N-1的、已经编译好的JDK。这是因为OpenJDK由多个部分(HotSpot、 JDK类库、 JAXWS、 JAXP……) 构成, 其中一部分( HotSpot) 代码使用C、 C++编写, 而更多的代码则是使用Java语言来实现, 因此编译这些Java代码就需要用到另一个编译期可用的JDK, 官方称这个JDK为“Bootstrap JDK”。 编译OpenJDK 12时, Bootstrap JDK必须使用JDK 11及之后的版本。 在Ubuntu中使用以下命令安装OpenJDK11

sudo apt-get install openjdk-11-jdk

编译

需要注意,路径不能包含中文,否则可能会引来意料之外的错误

执行以下命令进行预编译

bash configure --enable-debug --with-jvm-variants=server

对一些重要的参数解释(其它参数可以通过bash configure --help 查看)

  • --with-debug-level=<level> 编译级别,可选值为release、fastdebug、slowdebug,越往后执行优化就越少
  • --enable-debug 等效于 --with-debug-level=fastdebug
  • --with-jvm-variant=<variant>[,<variant>] 编译特定模式(variant)的HotSpot虚拟机,可以多个模式并存,可选值为server、client、minimal、core、zero、custom

执行过程中发现报错了,根据错误提示进行安装libfontconfig1-dev

重新执行上面的预编译指令,即可预编译通过(显示如下内容)

接下来就需要进行正式的编译

make images

编译完成后进入到./jdk/build/linux-86_64_server_fastdebug/jdk/bin下,就能看到java以及javac命令,输入./java -version查看版本

从版本信息中,可以看到编译后的版本含有编译时主机的一些基本信息。

从周志明大神书中可以看到,大神说启用了4条编译线程,8GB内存,编译了15分钟,但是我在实践的时候好像并没有这么长的时间,大约5分钟的时间,还是蛮快的。

由于使用clion打开并没有找到合适的CMakeLists.txt文件,导致程序各种报错,无法运行,如果有小伙伴解决了这个问题,希望可以联系我,帮助我解决这个问题,感激不尽!