天天看点

编译OpenJDK7(ubuntu14.4)编译OpenJDK7(ubuntu14.4)

编译OpenJDK7(ubuntu14.4)

正在学习《深入理解java虚拟机第2版》,在第一章的实例中,自己动手对openjdk7进行编译。以下是实验过程。本实验是在ubuntu14.04下进行的,编译的openjdk为openjdk 7,依赖的jdk为openjdk 6,使用用自己编译的jdk,莫名有种成就感。

注意:在编译openjdk7时,Bootstrap JDk必须使用 Jdk6 update 14 或之后的版本

openjdk7源码获取

直接从官网下载源码包即可 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文件夹中下进行

[email protected]:~# cd openjdk
[email protected]:~/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.

继续阅读