很久以前,买了一本周志明老师的《深入理解Java虚拟机——JVM高级特性与最佳实践》这本书。人在北京飘荡的几年里也没怎么好好看。
今年的3月份辞职归汉,在入职了新工作后,开始捡起书本充电学习了。
好了,废话少叙,下面开始跟我一起编译OpenJDK7吧。
写在前面
Tips:
- $ 开头的行表示该符号后面是需要在终端执行的命令
开头的行表示shell里的注释行
- 笔者使用的系统是 CentOS 7.5 x64,本文仅为笔者安装记录供大家参考之
- 行文难免有错误疏漏之处,还望大家指正,邮箱: rtfsc8@rtfsc8.top
基本信息
操作系统信息
版本号
笔者的操作系统信息如下:
$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core)
内核版本
$ uname -sr
Linux 3.10.0-862.3.3.el7.x86_64
CPU
$ lscpu | grep -i cpu
CPU op-mode(s): 32-bit, 64-bit
CPU(s): 4
On-line CPU(s) list: 0-3
CPU family: 6
Model name: Intel(R) Core(TM) i3-2328M CPU @ 2.20GHz
CPU MHz: 2200.000
CPU max MHz: 2200.0000
CPU min MHz: 800.0000
NUMA node0 CPU(s): 0-3
Memory
$ lsmem | grep -i total
Total online memory: 4G
Total offline memory: 0B
物料准备
OpenJDK7 源码下载
OpenJDK官网看这里,进入首页下方"Hack on the JDK itself"版块,由clone a Mercurial repository可以了解OpenJDK知识库术语和命名方案。由左侧目录的Source code下方的Mercurial可进入OpenJDK的代码版本管理系统。
获取OpenJDK源码有两种方式,其中一种是通过Mercurial代码版本管理工具从Repository中直接取得源码。
本文结合书本,使用OpenJDK7进行编译。
第二种方式就是下载官方提供的源码压缩包。因为Sun被Oracle收购,所以网站资源地址有变动,大家在OpenJDK™ Source Releases页面的地址是获取不到包的,通过openjdk-7-fcs-src-b147-27_jun_2011.zip进行下载。
Install Mercurial
# 安装hg工具
$ sudo yum -y install mercurial
# 查看版本
$ hg --version
Mercurial Distributed SCM (version 2.6.2)
(see http://mercurial.selenic.com for more information)
Copyright (C) 2005-2012 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Clone OpenJDK7 Source Code
通过 hg clone 是最直接的方式,从版本管理中看变更轨迹比看Release Note效果更好。但不足之处是速度太慢,笔者就在下载过程中失败了好几次才下载全。
# 创建java专用目录并进入该目录
$ mkdir ~/Downloads/java && cd ~/Downloads/java
# clone OpenJDK7源码
$ hg clone http://hg.openjdk.java.net/jdk7/jdk7 openjdk7
# 以上执行成功后请阅读README和README-builds.html
# 执行以下命令开始下载各模块代码
# 因网络原因可能下载部分失败,请重复执行以下命令直至完全下载成功
$ sh ./get_source.sh
# 完全下载成功后执行以下命令再次更新
$ sh ./make/scripts/hgforest.sh pull -u
执行完以上命令后,目录结构如下:
$ ls -Ghl
total 352K
-rw-rw-r--. 1 rtfsc8 1.5K 7月 3 22:23 ASSEMBLY_EXCEPTION
drwxrwxr-x. 2 rtfsc8 6 7月 5 22:49 build
drwxrwxr-x. 27 rtfsc8 4.0K 7月 7 10:55 build-jdk
drwxrwxr-x. 26 rtfsc8 4.0K 7月 7 10:24 build-jdk-debug
drwxrwxr-x. 6 rtfsc8 168 7月 3 22:24 corba
drwxrwxr-x. 2 rtfsc8 101 7月 4 00:30 drop
-rw-rw-r--. 1 rtfsc8 1.4K 7月 3 22:23 get_source.sh
drwxrwxr-x. 8 rtfsc8 193 7月 5 22:56 hotspot
drwxrwxr-x. 7 rtfsc8 4.0K 7月 3 22:24 jaxp
drwxrwxr-x. 7 rtfsc8 4.0K 7月 3 22:29 jaxws
drwxrwxr-x. 7 rtfsc8 180 7月 3 22:30 jdk
drwxrwxr-x. 7 rtfsc8 180 7月 3 22:24 langtools
-rw-rw-r--. 1 rtfsc8 19K 7月 3 22:23 LICENSE
drwxrwxr-x. 4 rtfsc8 4.0K 7月 3 22:23 make
-rw-rw-r--. 1 rtfsc8 16K 7月 3 22:23 Makefile
-rw-rw-r--. 1 rtfsc8 1.8K 7月 3 22:23 README
-rw-rw-r--. 1 rtfsc8 109K 7月 3 22:23 README-builds.html
drwxrwxr-x. 3 rtfsc8 19 7月 4 21:50 src
drwxrwxr-x. 2 rtfsc8 22 7月 3 22:23 test
-rw-rw-r--. 1 rtfsc8 169K 7月 3 22:23 THIRD_PARTY_README
依赖安装
基本依赖
$ sudo yum-builddep java-1.6.0-openjdk
<span id="oracle-jdk-1.6-install">Oracle JDK 1.6 安装</span>
这里是有一个坑的,为了避免大家踩坑,请提前安装好Oracle JDK 1.6。
# ALT_BOOTDIR 用到的是 OpenJDK 1.6.0 会有此报错, OpenJDK 的bug,需要使用 Oracle JDK
# 见到类似下方的报错了,恭喜童鞋您入坑了
# ./gamma: relocation error: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
下载传送门可能需要登陆Oracle,没有帐号的童鞋请注册一下。笔者下载安装的是jdk-6u38-linux-x64-rpm.bin。
如果上一个传送门失效,请继续传送!找到此页面上的Java SE 6进入传送哦~如果这个传送也失效了(T_T),那接着传送,拉到页面最下方,找到Java Archive栏,点击右侧DOWNLOAD按钮自行传送。再不行就只能找baidu了~~~
# 对下载到的bin动动手脚(不要想多,释放里面的rpm包而已)
$ sh jdk-6u38-linux-x64-rpm.bin
# 查看下得到的rpm包
$ ll *.rpm
# 安装Oracle JDK
$ sudo rpm -ivh jdk-6u38-linux-amd64.rpm
# OK 至此已完成Oracle JDK安装
# 查找安装的Oracle JDK目录
# 查找jdk安装名称
$ rpm -qa | grep ^jdk-1.6.0
jdk-1.6.0_38-fcs.x86_64
# 根据安装名称查找安装到本地的文件列表
$ rpm -ql jdk-1.6.0_38-fcs.x86_64
...
/usr/java/jdk1.6.0_38 # Oracle JDK HOME
...
# 以上查找到的目录后面会用到
Dependency Check
# 批量检查依赖包
$ rpm -qa cpio gawk gcc m4 make unzip zip gcc-c++ \
cups-devel alsa-lib-devel ant libXi-devel \
freetype libstdc++-static
# 未安装的包则通过yum安装之
# 例如 ant 未安装,则执行以下命令安装
$ sudo yum -y install ant
<span id="source-drops-download">Source Drops Download</span>
# 查看当前所在目录
$ pwd
/home/rtfsc8/Downloads/java/openjdk7
# 创建目录
$ mkdir ~/Downloads/java/openjdk7/drop
# 调转目录
$ cd ~/Downloads/java/openjdk7/drop/
# 下载plug
$ wget http://download.java.net/jaxp/1.4.5/jaxp145_01.zip
$ wget https://netix.dl.sourceforge.net/project/jdk7src/input-archives/jdk7-jaf-2010_08_19.zip
$ wget http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip
# 回到主编译目录
$ cd ..
准备编译
<span id="set-environment-variables">环境变量设置</span>
# 移除可能存在的openjdk或者其他jdk的影响
unset CLASSPATH
unset JAVA_HOME
export LANG=C \
ALT_BOOTDIR=/usr/java/jdk1.6.0_38 \
ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_38 \
ARCH_DATA_MODEL=64 \
MILESTONE=Rtfsc8 \
USE_PRECOMPILED_HEADER=true \
HOTSPOT_BUILD_JOB=4 \
ALT_PARALLEL_COMPILE_JOBS=4 \
SKIP_DEBUG_BUILD=false \
SKIP_FASTDEBUG_BUILD=true \
DEBUG_NAME=debug \
ALT_OUTPUTDIR=~/Downloads/java/openjdk7/build-jdk \
ALT_DROPS_DIR=~/Downloads/java/openjdk7/drop \
DISABLE_HOTSPOT_OS_VERSION_CHECK=OK
<span id="make-sanity">配置检查</span>
# 配置检查,出现Sanity check passed.即可进行下一步的编译工作
make sanity
<span id="start-building">开始编译</span>
# 开始编译
make
编译过程中遇到问题请自行解决,解决后执行 make clean 后依次参照如下次序重新编译直至编译成功。
环境变量设置
配置检查
编译
Done
恭喜童鞋~ 当您看到类似以下的输出时,您的jdk已经编译成功了~
Have fun and enjoy it~~~
>>>Making sec-files-win @ 2018年 07月 06日 星期五 00:26:08 CST ...
>>>Making jgss-files @ 2018年 07月 06日 星期五 00:26:08 CST ...
>>>Finished making images @ 2018年 07月 06日 星期五 00:26:08 CST ...
make[2]: Leaving directory `/home/rtfsc8/Downloads/java/openjdk7/jdk/make'
########################################################################
##### Leaving jdk for target(s) sanity all docs images #####
########################################################################
##### Build time 00:16:13 jdk for target(s) sanity all docs images #####
########################################################################
-- Build times ----------
Target debug_build
Start 2018-07-05 23:53:58
End 2018-07-06 00:26:08
00:03:25 corba
00:09:58 hotspot
00:00:43 jaxp
00:00:49 jaxws
00:16:13 jdk
00:01:02 langtools
00:32:10 TOTAL
-------------------------
make[1]: Leaving directory `/home/rtfsc8/Downloads/java/openjdk7'
写在最后
写得比较啰嗦,大家凑合看~
FAQ
Question List
jaxp/build-defs.xml:70: ERROR: Cannot find source for project jaxp
# 添加变量开关
export ALLOW_DOWNLOADS=true
build/linux-amd64/jaxws/build/xml_generated/build-drop-jaf_src.xml:96: Redirection detected from https to http. Protocol switch unsafe, not allowed.
ERROR: echo "*** This OS is not supported:" 'uname -a'; exit 1;
原因是CentOS7相对于OpenJDK7太新了,不在支持的操作系统列表里。
# 添加变量开关
export DISABLE_HOTSPOT_OS_VERSION_CHECK=OK
ERROR: error: "__LEAF" redefined [-Werror]
cd ~/Downloads/java/openjdk7/hotspot
# 打布丁,可以在源代码库搜索相应的问题
# 因为Sun被Oracle收购了,所以网上流传的一些帖子的资源地址不可访问了,建议还是在源代码库去查找
hg patch http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/raw-rev/a6eef545f1a2
ERROR error: converting ‘false’ to pointer type ‘methodOop’ [-Werror=conversion-null]
cd ~/Downloads/java/openjdk7/hotspot
# 打布丁,可以在源代码库搜索相应的问题
# 因为Sun被Oracle收购了,所以网上流传的一些帖子的资源地址不可访问了,建议还是在源代码库去查找
hg patch http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/raw-rev/f457154eee8b
./gamma: relocation error: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
OpenJDK 1.6 的 bug,ALT_BOOTDIR 需要替换为Oracle JDK 1.6。
ERROR gcc: error: unrecognized command line option '-mimpure-text'
# 这个-mimpure-text是gcc给Solaris的编译选项,所以以#注释掉该选项即可
# 文件: ./jdk/make/common/shared/Compiler-gcc.gmk
# line: 70
Error: time is more than 10 years from present: 1136059200000
# 修改以下文件,将日期改为十年以内,JDK的Bug。
# File: ./jdk/src/share/classes/java/util/CurrencyData.properties
# line: 108 377 439 529 555
*** No rule to make target /NOT-SET/re/jdk/1.7.0/promoted/latest/binaries/linux-amd64/jre/lib/amd64/server/libjvm.so', needed by
/home/rtfsc8/rtfsc8/jvm/java/openjdk7/build-jdk/../build-jdk-debug/lib/amd64/server/libjvm.so’. Stop.
export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_38
Reference
- README-builds.html
- OpenJDK™ Source Releases
- OpenJDK Repositories
- collision between __LEAF define
- Don’t return booleans from methods returning pointers Summary: Changed "return false" to "return NULL"
- Linux CentOS 6.9 Minimal 编译 OpenJDK 7
- ubuntu 13.04环境编译OpenJDK7
- 编译OpenJDK(Cannot find source for project jaxp)
- ubuntu 13.04环境编译OpenJDK7 *** This OS is not supported
- OpenJDK源码阅读导航
- 获取OpenJDK源码的两种方式
声明:
未经特别说明,本站Blog均采用署名-非商业性使用-禁止演绎 2.5 中国大陆授权。任何违反本协议的行为均属于非法行为。如需非商业性转载,请保留署名。如需商业性转载出版,请直接和我联系。
《“Building OpenJDK7 with CentOS7”》 有 1 条评论
[…] Building OpenJDK7 with CentOS7 – Rtfsc8 http://blog.rtfsc8.top/2018/07/07/building-openjdk7-with-centos7/ […]