Ubuntu14.04LTS编译JDK1.8
一、前言
最近学习周志明老师的《深入理解Java虚拟机》一书,想要自己编译一个jvm,中间经历了许多波折,故将过程记录下来,希望能帮助到同样想要学习的同学们。
首先要说明的一点是,按照老师书上编译JDK1.7的步骤,我试了很多次,总是因为各种版本问题而出错,所以改编译JDK1.8。需要注意,编译1.8时会自动识别Bootstrap JDK,也就是说,不需要显示的指定其安装路径,当前也不能取消设置JAVA_HOME和CLASSPATH这两个环境变量,否则会报错。还有就是,编译时的系统不支持Ubuntu16.04:
*** This OS is not supported: Linux xiaoyao-ubuntu 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:41 UTC 2017 i686 i686 i686 GNU/Linux /usr/local/jdkbuild/openjdk/hotspot/make/linux/Makefile:238: recipe for target 'check_os_version' failed
二、准备工作
1. 编译环境
- 操作系统:Ubuntu14.04LTS - 32 bit
- Bootstrap JDK版本:java version "1.8.0_151"
- Ant版本:Apache Ant(TM) version 1.10.1 compiled on February 2 2017
- gcc版本:gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
2. 下载openjdk源码
网址:http://jdk.java.net
选择Java SE 8,往下拉
点击 zip file,下载源码
三、编译
这里要提醒一下学习《深入理解Java虚拟机》的同学,编译JDK1.8的步骤和编译1.7的步骤已经大不相同。老师书上说的设置各种环境变量这一步骤在编译1.8的时候可以略去,使用源码包里自带的脚本即可完成
1. 检查环境
解压刚才下载的源码包,进入解压后的目录,我放的路径是/usr/local/openjdk
1 $ cd /usr/local/openjdk/ 2 $ ll 3 total 436 4 drwxr-xr-x 14 root root 4096 11月 6 09:35 ./ 5 drwxr-xr-x 14 root root 4096 11月 6 09:19 ../ 6 -rwxr-xr-x 1 root root 7399 11月 6 09:35 a.out* 7 -rw-r--r-- 1 root root 1503 11月 6 09:19 ASSEMBLY_EXCEPTION 8 drwxr-xr-x 3 root root 4096 11月 6 09:35 build/ 9 drwxr-xr-x 6 root root 4096 11月 6 09:19 common/ 10 -rw-r--r-- 1 root root 1235 11月 6 09:19 configure 11 drwxr-xr-x 5 root root 4096 11月 6 09:19 corba/ 12 -rw-r--r-- 1 root root 3095 11月 6 09:19 get_source.sh 13 -rw-r--r-- 1 root root 70 11月 6 09:19 .hgignore 14 -rw-r--r-- 1 root root 19280 11月 6 09:19 .hgtags 15 drwxr-xr-x 7 root root 4096 11月 6 09:19 hotspot/ 16 drwxr-xr-x 6 root root 4096 11月 6 09:19 jaxp/ 17 drwxr-xr-x 6 root root 4096 11月 6 09:19 jaxws/ 18 drwxr-xr-x 2 root root 4096 11月 6 09:19 .jcheck/ 19 drwxr-xr-x 6 root root 4096 11月 6 09:19 jdk/ 20 drwxr-xr-x 6 root root 4096 11月 6 09:19 langtools/ 21 -rw-r--r-- 1 root root 19263 11月 6 09:19 LICENSE 22 drwxr-xr-x 6 root root 4096 11月 6 09:19 make/ 23 -rw-r--r-- 1 root root 6232 11月 6 09:19 Makefile 24 drwxr-xr-x 12 root root 4096 11月 6 09:19 nashorn/ 25 -rw-r--r-- 1 root root 1549 11月 6 09:19 README 26 -rw-r--r-- 1 root root 129333 11月 6 09:19 README-builds.html 27 drwxr-xr-x 2 root root 4096 11月 6 09:19 test/ 28 -rw-r--r-- 1 root root 178392 11月 6 09:19 THIRD_PARTY_README
在编译之前大家可以看一下 README 中的内容,里边有说编译步骤
以下步骤推荐大家获取root权限后操作,不仅可以少打很多sudo,还能避免一些奇怪的问题
1 # bash ./configure
执行此命令后,会自动检测编译环境是否满足条件,再次提醒:不能 unset JAVA_HOME,否则回报找不到jdk的错误
在命令执行过程中,可能会因为依赖的原因报错而终止,这时不要慌,看一下错误提示,缺什么依赖就安装一下,最后成功的话有如下提示:
1 ==================================================== 2 A new configuration has been successfully created in 3 /usr/local/jdkbuild/openjdk/build/linux-x86-normal-server-release 4 using default settings. 5 6 Configuration summary: 7 * Debug level: release 8 * JDK variant: normal 9 * JVM variants: server 10 * OpenJDK target: OS: linux, CPU architecture: x86, address length: 32 11 12 Tools summary: 13 * Boot JDK: java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) Server VM (build 25.151-b12, mixed mode) (at /usr/local/java/jdk1.8.0_151) 14 * C Compiler: gcc-5 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 version 20160609 (at /usr/bin/gcc-5) 15 * C++ Compiler: g++-5 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 version 20160609 (at /usr/bin/g++-5)
2. 编译
在编译之前,需要修改源码的一个地方
1 vim /usr/local/openjdk/hotspot/make/linux/makefiles/gcc.make
在这个文件中,找到“-Werror”这个字符串, 将他所在的行注释掉,否则会报错:cc1plus: warnings being treated as errors
使用命令make,注意加个参数,否则会报错:cc1plus: error: the "stabs" debug format cannot be used with pre-compiled headers [-Werror=deprecated]
1 make all DEBUG_BINARIES=true
然后就是漫长的等待......
最终结果
1 ----- Build times ------- 2 Start 2017-11-06 09:57:30 3 End 2017-11-06 10:45:55 4 00:01:02 corba 5 00:01:04 demos 6 00:04:59 docs 7 00:30:06 hotspot 8 00:01:42 images 9 00:00:28 jaxp 10 00:00:48 jaxws 11 00:07:56 jdk 12 00:00:01 langtools 13 00:00:17 nashorn 14 00:48:25 TOTAL 15 ------------------------- 16 Finished building OpenJDK for target 'all'
3. 测试
进入目录/usr/local/openjdk/build/linux-x86-normal-server-release/jdk/bin
执行./java -version
1 openjdk version "1.8.0-internal" 2 OpenJDK Runtime Environment (build 1.8.0-internal-root_2017_11_06_09_35-b00) 3 OpenJDK Server VM (build 25.40-b25, mixed mode)
编译成功
四、可能需要的依赖
1 sudo apt-get -y install build-essential 2 3 sudo apt-get -y install libx11-dev #注意X是小写, 错误提示里说的是大写 4 sudo apt-get -y install libxext-dev 5 sudo apt-get -y install libxrender-dev 6 sudo apt-get -y install libxtst-dev 7 sudo apt-get -y install libxt-dev 8 9 sudo apt-get -y install libcups2-dev 10 sudo apt-get -y install libfreetype6-dev 11 sudo apt-get -y install libasound2-dev 12 13 sudo apt-get -y install ccache