正在学习《深入理解java虚拟机第2版》,在第一章的实例中,自己动手对openjdk7进行编译。以下是实验过程。本实验是在ubuntu14.04下进行的,编译的openjdk为openjdk 7,依赖的jdk为openjdk 6,使用用自己编译的jdk,莫名有种成就感。
注意:在编译openjdk7时,Bootstrap JDk必须使用 Jdk6 update 14 或之后的版本
直接从官网下载源码包即可 openJDK7
获取源码包之后,需要对源码包进行解压
unzip openjdk-7u75-src-b13-18_dec_2014.zip
在使用下面的命令可一次安装完成
apt install build-essential gawk m4 libmotif3 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-dev ant
安装BootStrap jdk6
apt install openjdk-6-jdk
遇见问题1:
如果系统使用的是ubuntu16.04; 安装 libmotif3 时 如果出现错误 E: Package 'libmotif4' has no installation candidate
只是因为在最新的Ubuntu 16.04中不存在libmotif4,因此会发生此错误。
我们只需从libmotif4中下载deb文件,从文件下载到的目录运行以下命令:
sudo dpkg -i libmotif4_2.3.4-8ubuntu1_amd64.deb
此时我们需要的编译环境和依赖项目都准备完成,最后只需对系统的环境变量进行简单设置以便编译的顺利通过。
设置LANG 和ALT_BOOTDIR,必须设置
#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
export LANG=C
#Bootstrap JDK的安装路径。必须设置
export ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk-amd64
#允许自动下载依赖
export ALLOW_DOWNLOADS=true
#并行编译的线程数,设置为和CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=6
export ALT_PARALLEL_COMPILE_JOBS=6
#比较本次build出来的映像与先前版本的差异。这对我们来说没有意义,
#必须设置为false,否则sanity检查会报缺少先前版本JDK的映像的错误提示。
#如果已经设置dev或者DEV_ONLY=true,这个不显式设置也行
export SKIP_COMPARE_IMAGES=true
#使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true
#要编译的内容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true
#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build
BUILD_DEPLOY=false
#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,
#但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了
BUILD_INSTALL=false
如果之前设置了JAVA_HOME
和CLASSPATH
两个环境变量 ,在编译之前必须取消,否则会发生”诡异的事情“
unset CLASSPATH
unset JAVA_HOME
在设置完成之后,可以输入 make sanity
来检查我们前面的设置是否全部正确,该步骤必须在我们之前解压后的openjdk文件夹中下进行
root@ubuntu:~# cd openjdk
root@ubuntu:~/openjdk# make sanity
makefile的Sanity检查过程输出了编译所需的所有环境变量,如果看见‘ Sanity check passed. ’
则代表检查通过。
Build Platform Settings:
USER = root
PLATFORM = linux
ARCH = amd64
LIBARCH = amd64
ARCH_FAMILY = amd64
ARCH_DATA_MODEL = 64
ARCHPROP = amd64
ALSA_VERSION = 1.1.0
OS_VERSION = 4.15.0-107-generic [requires at least 2.6]
OS_VARIANT_NAME = Ubuntu
OS_VARIANT_VERSION = 16.04
MB_OF_MEMORY = 2978
-----------------------------省略部分------------------------------
Previous JDK Settings:
PREVIOUS_RELEASE_PATH = USING-PREVIOUS_RELEASE_IMAGE
ALT_PREVIOUS_RELEASE_PATH =
PREVIOUS_JDK_VERSION = 1.6.0
ALT_PREVIOUS_JDK_VERSION =
PREVIOUS_JDK_FILE =
ALT_PREVIOUS_JDK_FILE =
PREVIOUS_JRE_FILE =
ALT_PREVIOUS_JRE_FILE =
PREVIOUS_RELEASE_IMAGE = /usr/lib/jvm/java-1.8.0-openjdk-amd64
ALT_PREVIOUS_RELEASE_IMAGE =
Sanity check passed.
接下来可以输入make
执行整个OpenJDK 编译(make不带参数 , 默认为make all)
编译的时间有点长,耐心等待。。。
遇见问题2
使用‘make’编译时会,出现 check_os_version 错误,这是为了阻止源码在老版本上被编译
解决方法:
方法一: 添加对应的内核版本SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%
方法二: 在make
时添加参数 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
我使用的是方法二
make DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
遇见问题3:time is more than 10 years from present
Error: time is more than 10 years from present: 1136059200000
java.lang.RuntimeException: time is more than 10 years from present: 1136059200000
at build.tools.generatecurrencydata.GenerateCurrencyData.makeSpecialCaseEntry(GenerateCurrencyData.java:285)
at build.tools.generatecurrencydata.GenerateCurrencyData.buildMainAndSpecialCaseTables(GenerateCurrencyData.java:225)
at build.tools.generatecurrencydata.GenerateCurrencyData.main(GenerateCurrencyData.java:154)
解决方法:
修改jdk/src/share/classes/java/util/CurrencyData.properties
文件
vim jdk/src/share/classes//java/util/CurrencyData.properties
#修改108
AZ=AZM;2019-12-31-20-00-00;AZN
#修改381行
MZ=MZM;2019-06-30-22-00-00;MZN
#修改443行
RO=ROL;2019-06-30-21-00-00;RON
#修改535行
TR=TRL;2019-12-31-22-00-00;TRY
#修改561行
VE=VEB;2019-01-01-04-00-00;VEF
vim显示怎么行号?
按ESC键 然后输入:set nu
,回车 即可
改过之后
按ESC键 然后输入:wq
,保存并退出 即可
下面是编译成功的结果
#-- Build times ----------
Target all_product_build
Start 2020-07-06 20:05:03
End 2020-07-06 20:12:18
00:00:08 corba
00:00:05 hotspot
00:00:02 jaxp
00:00:02 jaxws
00:06:56 jdk
00:00:02 langtools
00:07:15 TOTAL
-------------------------
end.