关于源代码
当前的openJDK的源代码已经被发布到了github上了,所以我们可以直接从github上下载到。
OpenJDK11u源码托管地址:https://github.com/openjdk/jdk11u
带后缀U的地址,或者发行的jdk包,表示当前版本下的持续跟新版。而他们对应的各自的正式发行版可以在其对应代码托管地址的tag中找到。
这里我们使用jdk11当前的最新更新的正式发行版作为源代码来编译,下载地址如下
jdk-11.0.17-ga:https://github.com/openjdk/jdk11u/archive/refs/tags/jdk-11.0.17-ga.tar.gz
关于BootstrapJDK
但凡是遇到了bootstrap这样的字眼,它所要解决的问题只有一个,那就是,当你掉进一个井里,你需要通过拉自己的靴子,把自己拉出井以实现自救。这是个哲学问题。言归正传,之所以需要bootstrapJDK,是因为jdk的编译过程需要执行java代码,也就是说 需要一个能正常运行的jdk存在。编译自己需要自己的存在!一般而言,这个bootstrapJDK由你当前编译jdk版本的上一个版本担当。
编译环境
本次编译使用的系统:GNU/Linux 发行版debian11
编译器:gcc-10.2.0。
BootstrapJDK:jdk11,可以从网上下载一个,也可以从源码编一个。
开始编译jdk-11.0.17-ga
首先我们建立一个干净的目录buildjdk,然后进入到这个目录中。
从上面的链接下载jdk-11.0.17-ga的源代码包,然后解压会得到一个目录jdk11u-jdk-11.0.17-ga。
jdk11u源代码目录介绍
jdk11的所有组件的源码都被整合到了其根目录下的src目录中,这里就不一一介绍了。
编译依赖工具
名称 | 说明 |
---|---|
Bootstrap JDK | 编译JDK需要使用的一个预先存在的jdk,这里我们就直接使用oracle官网提供的jdk11了。 下载地址:https://www.oracle.com/hk/java/technologies/downloads |
gcc | gcc工具,这里使用gcc-10.2.1编译成功。 |
zip和unzip | zip工具版本>=2.2,unzip工具>=5.12。如果你的linux发行版的源上没有符合条件的版本可从这里下载自行安装。 下载地址:http://www.info-zip.org |
Common UNIX Printing System (CUPS) Headers | cpus的头文件,这个头文件一般可以通过在你的linux发行版上安装其对应的开发包获得。 |
XRender Extension Headers | XRender头文件,通向安装其对应的开发包即可。 |
FreeType 2 | FreeType的版本>=2.3,较新版本的linux发行版从源中安装的这个软件的默认目录可能与jdk11的默认搜寻路径不符,本教程中直接从源码边一个,后面会讲解。 下载地址:http://www.freetype.org |
Advanced Linux Sound Architecture (ALSA) | ALSA版本>=0.9.1。这个建议使用你自己的linux发行版的源进行安装。通常你可以使用关键字libasound在你的源中搜索,找到合适的版本进行安装。 |
编译选项
make选项 | 说明 |
---|---|
all | 构建一个完整的jdk,这也是默认选项。如果你直接执行make命令将执行这个选项规则。 |
help | 输出编译选项帮助信息。例如:make help |
clean | 清除编译时产生的临时文件。 |
--with-target-bits | 选择构建jdk的位数。例如:--with-target-bits=64。 |
--with-version-pre | java -version命令输出的一个版本后缀标识,默认是internal |
--with-version-string | 指定版本后缀 |
--with-version-build | 指点版本的构建序号,很大意义上代表着你对此版本的第几次构建,指定了--with-version-string后,必须指定此选项。 |
--with-boot-jdk | 指定BootstrapJDK的路径 |
--with-freetype-include | 指定freetype2的安装目录下的include目录 |
--with-freetype-lib | 指定freetype2的安装目录下的lib目录 |
开始编译
下载jdk-11.0.17-ga:https://github.com/openjdk/jdk11u/archive/refs/tags/jdk-11.0.17-ga.tar.gz
下载freetype2.12.1:https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.gz
下载bootstrapJDK:https://www.oracle.com/hk/java/technologies/downloads
编译freetype2
先下载freetype2:https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.gz
解压freetype-2.12.1.tar.gz,并进入freetype源代码目录
tar -xvf freetype-2.12.1.tar.gz
cd freetype-2.12.1
执行编译前检查命令:
./configure --prefix=自定义一个路径。 注意这里我们不要使用默认的路径,会污染你的当前系统。
然后编译安装,注意要记住安装路径,一会我们要用到。
make
make install
开始编译jdk11u
编译环境检测
bash configure \
--with-version-string=11 (必须是数字,一般情况下就是你当前编译的jdk版本) \
--with-version-build=17 (必须是数字,且不能稍过255)\
--with-version-pre=你可以指定任意你想指定的字符串 \
--with-boot-jdk=你下载的jdk11安装目录 \
--with-freetype-include=上面编译的freetype的安装目录/include \
--with-freetype-lib=上面编译的freetype的安装目录/lib
真正的编译
make all
编译完成
经过漫长的等待你将会看到如下输出
至此我们jdk11u的编译就成功了,编译好的内容都放在路径:jdk11u-jdk-11.0.17-ga/build/linux-x86_64-normal-server-release/images中
目录介绍
目录名称 | 说明 |
---|---|
jdk | 这就是我们平时用的jdk,我们可以将其命名为jdk11u-0-17。然后我们就能正常使用啦! |
接下来让我们测试一下吧
进入目录jdk11u-jdk-11.0.17-ga/build/linux-x86_64-normal-server-release/images/jdk/bin
执行命令:./java -version
我们看到了正常的版本输出。成功!!