手动编译jdk

落爺英雄遲暮 提交于 2020-07-29 02:56:06

自己动手编译jdk

此次编译的jdk版本为12
编译环境为

  • ubuntu 18.0.4LTS
  • jdk12
  • 因为源码中有java代码,故需要先安装一个jdk环境,环境为jdk11

1)下载jdk

下载地址为

http://hg.openjdk.java.net/jdk
选择需要编译的jdk版本,此次选择的是12
点击之后,可以在最左边的菜单栏中点击browse浏览jdk代码目录结构
然后点击gz或者zip,因为使用的是ubuntu,故选在gz格式的

2)解压以后,查看doc文件夹下的Building.html文件

这个文件,就是详细介绍如何编译jdk,需要的环境,怎么配置等等信息,十分必要,编译之前一定要好好浏览一下。

3) 浏览Building.html文件

得知,整个编译步骤分为如下几步

4)构建编译环境

sudo apt-get install build-essential

5)安装编译jdk需要的依赖

  • 安装 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 libxtst-dev libxt-dev

  • 安装 ALSA
sudo apt-get install libasound2-dev

  • 安装 libffi
sudo apt-get install libffi-dev

6) 编译

编译命令
bash configure [options]
编译FastDebug版、仅含Server模式的HotSpot虚拟机
bash configure --enable-debug --with-jvm-variants=server --enable-dtrace

[options]参数介绍

  • --with-debug-level=<level>:设置编译的级别,可选值为release、fastdebug、slowde-bug,越往后进 行的优化措施就越少,带的调试信息就越多。还有一些虚拟机调试参数必须在特定模式下才可以使 用。默认值为release。
  • --enable-debug:等效于--with-debug-level=fastdebug。
  • --with-native-debug-symbols=<method>:确定调试符号信息的编译方式,可选值为none、 internal、external、zipped。
  • --with-version-string=<string>:设置编译JDK的版本号,譬如java-version的输出就会显示该信息。 这个参数还有--with-version-<part>=<value>的形式,其中part可以是pre、opt、build、major、minor、 security、patch之一,用于设置版本号的某一个部分。
  • --with-jvm-variants=<variant>[,<variant>...]:编译特定模式(Variants)的HotSpot虚拟机,可以 多个模式并存,可选值为server、client、minimal、core、zero、custom。
  • --with-jvm-features=<feature>[,<feature>...]:针对--with-jvm-variants=custom时的自定义虚拟机特 性列表(Features),可以多个特性并存,由于可选值较多,请参见help命令输出。
  • --with-target-bits=<bits>:指明要编译32位还是64位的Java虚拟机,在64位机器上也可以通过交叉 编译生成32位的虚拟机。 - --with-<lib>=<path>:用于指明依赖包的具体路径,通常使用在安装了多个不同版本的Bootstrap JDK和依赖包的情况。其中lib的可选值包括boot-jd、freetype、cups、x、alsa、libffi、jtreg、libjpeg、 giflib、libpng、lcms、zlib。
  • --with-extra-<flagtype>=<flags>:用于设定C、C++和Java代码编译时的额外编译器参数,其中 flagtype可选值为cflags、cxxflags、ldflags,分别代表C、C++和Java代码的参数。
  • --with-conf-name=<name>:指定编译配置名称,OpenJDK支持使用不同的配置进行编译,默认会 根据编译的操作系统、指令集架构、调试级别自动生成一个配置名称,譬如“linux-x86_64-server- release”,如果在这些信息都相同的情况下保存不同的编译参数配置,就需要使用这个参数来自定义配 置名称。
  • 以上是configure命令的部分参数,其他未介绍到的可以使用“bash configure--help”来查看,所有参 数均通过以下形式使用

如果一切顺利,会得到如下信息

A new configuration has been successfully created in 
/home/jdk/develop/java/jdk12/build/linux-x86_64-server-release using default settings

在configure命令以及后面的make命令的执行过程中,会在“build/配置名称”目录下产生如下目录结 构。不常使用C/C++的读者要特别注意,如果多次编译,或者目录结构成功产生后又再次修改了配 置,必须先使用“make clean”和“make dist-clean”命令清理目录,才能确保新的配置生效。编译产生的目 录结构以及用途如下所示:

buildtools/:用于生成、存放编译过程中用到的工具 
hotspot/:HotSpot虚拟机编译的中间文件 
images/:使用make *-image产生的镜像存放在这里 
jdk/:编译后产生的JDK就放在这里 
support/:存放编译时产生的中间文件 
test-results/:存放编译后的自动化测试结果 
configure-support/:这三个目录是存放执行configure、make和test的临时文件 
make-support/ test-support/

依赖检查通过后便可以输入“make images”执行整个OpenJDK编译了,这里“images”是“product- images”编译目标(Target)的简写别名,这个目标的作用是编译出整个JDK镜像,除了“product- images”以外,其他编译目标还有:

hotspot:只编译HotSpot虚拟机 
hotspot-<variant>:只编译特定模式的HotSpot虚拟机 
docs-image:产生JDK的文档镜像 
test-image:产生JDK的测试镜像 
all-images:相当于连续调用product、docs、test三个编译目标 
bootcycle-images:编译两次JDK,其中第二次使用第一次的编译结果作为Bootstrap JDK 
clean:清理make命令产生的临时文件 
dist-clean:清理make和configure命令产生的临时文件

7) 编译完成

编译完成之后,进入OpenJDK源码的“build/配置名称/jdk”目录下就可以看到OpenJDK的完整 编译结果了,把它复制到JAVA_HOME目录,就可以作为一个完整的JDK来使用,如果没有人为设置 过JDK开发版本的话,这个JDK的开发版本号里默认会带上编译的机器名,如下所示

./java -version
openjdk version "12-internal" 2020-06-08 OpenJDK Runtime Environment  
(build 12-internal+0-adhoc.jdk.jdk12) OpenJDK 64-Bit Server VM (build 12-internal+0-adhoc.jdk.jdk12, mixed mode)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!