几番周折终于在自己的CentOS5.5上编译成功了OpenJDK6,将编译过程和遇到的问题作一简要记录,备查。
0. OpenJDK介绍
OpenJDK是Sun(现Oracle)公司发布的基于GPL许可的Java平台的实现。其优点:
1、它的核心代码与同时期Sun(-> Oracle)的产品版基本上是一样的,血统纯正,不用担心性能问题,也基本上没什么兼容性问题;(代码上最主要的差异是在原本JDK依赖的第三方库上,包括加密库、音频库、字体等。核心部分,也就是HotSpot VM与Java核心库基本上保持了Sun JDK的原貌,甚至还比Sun JDK更快的吸收社区反馈的贡献)
2、它是真正开源的,许可证是GPLv2+CE,使用上比原本JDK的另外两种许可证要自由一些;
3、由于考虑到社区的开发者的build环境需求,OpenJDK的构建系统比原本的JDK有大幅改进,使整个build过程变得非常轻松。
--引自师兄RednaxelaFX的博客文章
编译过程参考了许多文章,详见附录。不像其他多数文章一样只是单纯的第一步敲什么命令第二步敲什么命令,RednaxelaFX的笔记尤其详细,从背景到各依赖项和配置项都说得很明白。强烈建议参考。
前一类的文章只有命令没有解释,遇到由于链接失效或版本不匹配的情况,命令执行不下去。新手如果不擅长从错误日志中分析原因往往就会卡个半天。所以方法论层面的东西就显得尤为重要。
我们的需求:在Linux XX 发行版(版本号xx)上编译OpenJDK x
基本步骤:
1. 下载OpenJDK x源码 http://download.java.net/openjdk/
2. 参考相应源码中的Build README,了解所需编译环境、依赖包
3. 安装依赖包
4. 环境配置
5. 健全性检查
6. 编译
最后的编译过程视配置情况从十几分钟到几小时不等,困难之处在解决3、4、5步骤中可能会遇到的各种问题。
同一个解决方案不适用于不同的Linux发行版本,甚至不适用于同一个发行版本的两个小版本;OpenJDK的版本、以及各个依赖包的版本都会有影响;
主要的错误都在于缺少某个依赖包、缺少某个特定版本的依赖包、缺少某个头文件、找不到某个特定类型--基本上都属于依赖包缺失导致的。
学会通过错误日志发现并解决问题才是更重要更有益的。
下面以本人在CentOS5.5上编译OpenJDK6的过程来具体说明:
1. 下载OpenJDK6源码
http://download.java.net/openjdk/jdk6/
2. 查看README,了解编译环境和所需依赖包
http://hg.openjdk.java.net/jdk6/jdk6/raw-file/tip/README-builds.html
这个文档中没有针对CentOS的编译环境的专门说明,只有针对Fedroa的。由于CentOS是RHEL(RedHat Enterprise Linux)去掉redhat标志重新编译的Linux版本,与RHEL很接近,而Fedroa又是RedHat公司支持的社区版,因此可以参照Fedroa的环境配置CentOS
Ruby代码
- <span>Fedora 9
- After installing Fedora 9 you need to install several build dependencies. The simplest way to do it is to execute the following commands as user root:
- yum-builddep java-1.6.0-openjdk
- yum install gcc gcc-c++
- In addition, it‘s necessary to set a few environment variables for the build:
- export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk
- </span>
可见,要编译OpenJDK,首先需要一个JDK(作为Bootstrap JDK, 否则Ant等工具无法运行),然后需要gcc/g++等编译器,同时需要设置相应的环境变量,取消JAVA_HOME(unset JAVA_HOME)的设置,将ALT_BOOTDIR指向已有jdk所在目录
在README文档中的Build Dependencies一节中可以看到编译所需的依赖包
Ant,构建工具,注意对它的版本也有要求;README中提到至少要1.7.1,而在实际编译中需要1.8.2以上
gcc, 版本4.0以上
CUPS(Common Unix Printing System,通用Unix打印系统)的头文件
Motif, 由开放基金协会OSF开发的一个工业标准GUI的相关头文件
FreeType, 一个开源的字体引擎,提供统一的接口来访问字体格式文件,要求版本2.3以上
ALSA(Advanced Linux Sound Architecture,高级Linux声音架构),为Linux提供音频和MIDI支持。要求版本0.9以上
Xorg,Xorg基金会的X11开源实现
3. 安装依赖包
其实建议的方法是在下载完代码和安装好Bootstrap JDK和Ant之后直接使用make sanity进行健全性检查。此时由于缺少Build Dependencies中的依赖包理所当然地会报出非常多的错误。根据错误日志中提示缺少的具体包和具体版本再进行安装
安装依赖包首选通过yum install直接安装;但yum源上有时没有指定版本的rpm,这就需要单独下载安装了(例如Ant1.8和FreeType2.3)。每个所需依赖包的安装又可以单独用一篇帖子介绍,主要是各自又存在软件包的依赖性问题。一般来说,建议下载源码进行编译,这样有错误比较容易检查;下载rpm包安装容易陷入无限的依赖循环中去。
3.0 gcc
yum install gcc gcc-c++
3.1 alsa
yum install alsa-lib alsa-lib-devel
3.2 cups
yum install cups-devel
3.3 libXi
yum install libXi libXi-devel
3.4 xorg
yum install xorg-X11
3.5 freetype
wget http://download.savannah.gnu.org/releases/freetype/freetype-2.3.12.tar.gz
tar -xvf freetype-2.3.12.tar.gz
cd freetype-2.3.12
./configure && make && make install
3.6 ant
wget http://mirror.bit.edu.cn/apache//ant/binaries/apache-ant-1.8.2-bin.zip
解压,配置ANT_HOME
3.7 motif
yum install openmotif
yum install openmotif-devel
3.8 ant-nodeps
yum install ant-nodeps
3.9 libXtst
yum install libXtst
yum install libXtst-devel
4. 环境配置
export ALT_BOOTDIR=Bootstrap JDK目录
export ANT_HOME=ant安装目录
export ALT_FREETYPE_HEADERS_PATH=/usr/local/include/freetype2 #freetype2头文件安装目录
export ALT_FREETYPE_LIB_PATH=/usr/local/lib #freetype2 lib目录
要为所有用户设定这些环境变量,可将上述语句添加到/etc/profile中。修改环境变量的方式在此不赘述
不要忘记README中的 export LANG=C和unset JAVA_HOME
5. 健全性检查
在下载的OpenJDK源码目录中执行make sanity进行检查。
输出Sanity check passed.表示检查通过
6. 执行编译
在健全性检查通过后,可以通过make执行编译
make all ARCH_DATA_MODEL=64 ALLOW_DOWNLOADS=true
7. 问题排查
如前所述,在安装了README中所述的依赖包之外,还会因为各自的环境不同报缺少依赖包或缺少头文件等问题。
7.1缺少依赖包
一种情况是能够直接在yum源上找到,如ant-nodeps, lXtst;参见3.8、3.9
另一种情况是yum源上找不到,或者源上的版本比较旧,如ant, freetype;参见3.5、3.6
7.2 缺少头文件
如缺少motif相关头文件、CUPS相关头文件等;日志不会提示缺少哪个包,只提示缺少具体的某个头文件,如"AtomMgr.h"
须先通过yum provides AtomMgr.h查看缺少的头文件在哪个软件包中,然后再yum install安装该软件包
极端情况yum provides找不到头文件归属,此时请自行Google
笔者实际遇到的问题:
健全检查时:
1. 缺少freetype2.3
2. 缺少AtomMgr.h
3. 缺少CUPS.h
编译时:
1. Could not create task or type of type: replaceregexp
参见:http://stackoverflow.com/questions/8944128/ants-optional-tasks-are-not-available-on-centos
yum install ant-nodeps
2. /usr/bin/ld: cannot find -lXtst
解决方案在正文中已经全部提过了。
不管遇到什么问题,要从该问题产生的本质去思考去排查。
方法论比方法重要。渔比鱼重要。
Reference:
1. 在XUbuntu 10.10上以JRL源码构建Oracle JDK 6 update 23, http://rednaxelafx.iteye.com/blog/875957
2. Wikipedia: OpenJDK, http://en.wikipedia.org/wiki/OpenJDK
3. OpenJDK 6 Build README, http://hg.openjdk.java.net/jdk6/jdk6/raw-file/tip/README-builds.html
4. centos 5 5.3 编译openjdk 7, http://hi.baidu.com/jongsuny/item/dfc96c2dce1a029bb73263dd
5. OpenJDK编译手记, http://khotyn.iteye.com/blog/1225348
文中所有链接及参考资料在本文发布之时均验证可用