在CentOS5.5上编译OpenJDK6

几番周折终于在自己的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代码

  1. <span>Fedora 9
  2. 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:
  3. yum-builddep java-1.6.0-openjdk
  4. yum install gcc gcc-c++
  5. In addition, it‘s necessary to set a few environment variables for the build:
  6. export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk
  7. </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

Missing regexp.jar

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

文中所有链接及参考资料在本文发布之时均验证可用

时间: 2024-10-19 09:29:25

在CentOS5.5上编译OpenJDK6的相关文章

CentOS5.5上安装Python2.7及ez_setup和pip包

CentOS5.5上安装Python2.7及ez_setup和pip包 下载 首先从Python官方下载源码包下载 编译安装 这里将python安装到/opt/python27目录下 tar xvf Python-2.7.10.tgz ./configure --prefix=/opt/python27 --enable-shared make sudo make install 安装完成后,为了避免有时候运行python报下面的错误 /opt/python27/bin/python: erro

尝试在Mac上编译DNX

自从XRE改名为DNX至今,从来没有在Mac OS X上成功编译过DNX.一直很纳闷,难道DNX的开发人员不用Mac?今天突然明白了,DNX的开发人员真的不用Mac.而且DNX用的2个持续集成服务AppVeyor与Travis,一个是Windows环境,一个是Linux环境,就是没有Mac OS X环境. 看来不能指望DNX的开发人员短期内解决这个问题了,只能自己动手. 编译的错误信息如下(编译命令./build.sh): Restore complete, 725ms elapsed info

CentOS 6上编译安装AMP详解

在CentOS 6上编译安装AMP     A:Apache(httpd)     M:MySQL or MariaDB     P:php 目录: 一.准备工作 二.编译安装Apache(httpd) 三.编译安装MariaDB 四.编译安装PHP 编译安装AMP的优点: 根据生产环境灵活定制程序 优化编译参数,提高性能 解决不必要的软件依赖 一.准备工作 1.需要的软件包及版本号: httpd-2.4.27(apr-1.5.2+ apr-util-1.5.4) + MariaDB-5.5.5

CentOS6.7上编译安装Apache2.2和Apache2.4

目录 一.Apache的工作模式 1.简介 2.比较 二.CentOS6.x上安装Apache2.2 (一)rpm安装apache (二)编译安装apache 1.安装编译环境 2.下载解压依赖包 3.安装apache 4.测试apache 5.查看apache相关信息 6.配置程序运行环境 7.导出库文件 8.导出头文件 9.导出手册 10.将Apache添加到启动服务 (三) 编译安装Apache2.4 1.编译安装apr 2.编译安装apr-util 3.安装需要的依赖包 4.编译安装Ap

Mac上编译并运行Android5.0源码

下载.配置环境.build和运行参考的都是Android Source提供的文档,包括:Initializing a Build Environment,Downloading the Source和Building the System. 我是在OSX 10.10.3上编译的AOSP,记录一下中途碰到的各种问题. 下载 AOSP需要FQ,而且经常会断,还好是断点续传,坚持个两三天怎么也能下下来. case sensitive system 我在Mac上对file system只会用Disk U

在Linux CentOS上编译CoreCLR

经过几天的努力,终于解决了在CentOS上编译CoreCLR的问题.最终发现问题是CMAKE_C_FLAGS的设置引起的. 只要在“src/pal/tools/clang-compiler-override.txt”中删除“SET (CMAKE_C_FLAGS_INIT "-Wall -std=c11") ”,在“src/pal/tests/CMakeLists.txt”添加“SET (CMAKE_C_FLAGS "-Wall -std=c11")”,就能编译了.

于Linux-2.6.32内核上编译ipset-6.23的坎坷经历

新版本的ipset 上周在儿童医院给小小看病等待叫号的间隙,收到了Netfilter邮件列表的推送消息,一览了ipset最新的6.23版本的新特性,很多正是我目前所需要的,特别是timeout和skbinfo参数的支持,具体的详情请自行查看manual,如果不想看那么多,我这里简单的贴一下:    timeout       All  set  types  supports the optional timeout parameter when creating a set and addin

linux系统上编译好的ImageMagick做迁移

如何把编译好的工具迁移到另一台机器上去,有时候我们会遇到这样的问题,怎样解决库文件的依赖问题就需要我们按照出错提示去解决问题了,我以ImageMagick为例做下讲解. 如何编译安装ImageMagick环境,参照我的上一篇文章ImageMagick的安装和使用案例,链接: http://xiaoxiaozhou.blog.51cto.com/4681537/1903499 在本文中两台主机分别用server1和server2标识,server1为安装编译好ImageMagick的系统,serv

在 OSX 10.9.4 上编译安装 FastDFS 及其 PHP 扩展

经我测试,在OSX 10.9.4上安装FastDFS V5.01的话会很悲剧,一开始就无法安装,会遇到这帖子中的问题:http://www.oschina.net/question/252582_162768 而我还死活解决不了,貌OSX上就没有ldconfig这个东东,反正我也不懂Linux和UNIX这类的系统. 于是只好退而求其次,安个老版本来用,毕竟我只是为了装FastDFS的PHP扩展,以便在Mac上开发PHP项目,而真正的FastDFS模拟服务器环境是在另一台联想Win7上的虚拟机中的