CentOS编译OpenJDK

一、准备编译环境

1、安装alsa声卡驱动包

yum install alsa-lib-devel


CentOS编译OpenJDK_第1张图片

2、安装cups-devel

yum install cups-devel

CentOS编译OpenJDK_第2张图片

CentOS编译OpenJDK_第3张图片

3、安装X相关的库

yum install libX*

CentOS编译OpenJDK_第4张图片

CentOS编译OpenJDK_第5张图片

4、安装gcc编辑器

yum install gccgcc-c++



5、安装freetype

由于系统是Centos的,所以从http://rpm.pbone.net/index.php3/stat/4/idpl/26641422/dir/centos_7/com/freetype-2.4.11-9.el7.x86_64.rpm.html下载rpm包

rpm –ivh freetype-2.4.11-9.el7.src.rpm


6、安装libstdc

yum install libstdc++-static



7、安装Ant,用于执行Java编译代码中的Ant脚本安装包下载地址:http://ant.apache.org/bindownload.cgi

tar –zxvf apache-ant-1.10.1-bin.tar.gz

8、安装1.7版本的JDK

从官网下载安装包,使用filezila上传到虚拟机

解压缩安装包:gunzip jdk-7u79-linux-x64.gz


tar –xvf jdk-7u79-linux-x64.gz

修改环境变量

vim /etc/profile

在文件末尾添加下面的命令

#set environment

JAVA_HOME=/usr/java/jdk1.7.0_79

CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME CLASSPATH PATH

CentOS编译OpenJDK_第6张图片

保存退出,执行source /etc/profile使环境变量立即生效

执行java –version验证安装是否成功


9、下载OpenJDK源码

https://www.mercurial-scm.org/release/centos7/RPMS/x86_64/

这里选择的是:openjdk-7u75-src-b13-18_dec_2014.zip

解压缩:unzip openjdk-7u75-src-b13-18_dec_2014.zip

二、进行编译

OpenJDK在编译时读取的环境变量有很多,但大多都有默认值,必须设置的只有两个:LANG和ALT_BOOTDIR,前者是设定语言选项,必须设置为:

export LANG=C


否者在编译前的验证阶段会出现一个HashTable空指针异常。另外一个ALT_BOOTDIR是Bootstrap JDK,因为OpenJDk的各个组成部分(Hostspot、JDK API、JAXWS、JAXP……),有的是用C++编写的,更多的代码是用

JAVA语言自身实现的。因此编译这些Java代码需要用到一个可用的JDK,官方称这个JDK为“Bootstrap JDK”。

export ALT_BOOTDIR=/usr/java/jdk1.7.0_79


另外,之前设置的JAVA_HOME和CLASSPATH两个环境变量在编译之前必须取消,否则Makefile脚本中检查到有这两个环境变量存在,会有警告提示。

unset JAVA_HOME

unset CLASSPATH

CentOS编译OpenJDK_第7张图片

#允许自动下载依赖

export ALLOW_DOWNLOADS=true


#设置Ant的安装路径

export ANT_HOME=/root/apache-ant-1.10.1


#设置并行编译的线程数,设置成和CPU内核数量一样

export HOTSPOT_BUILD_JOB=4 
export ALT_PARALLEL_COMPILE_JOBS=4

CentOS编译OpenJDK_第8张图片

比较本次build出来的映像和之前版本的差异,必须设置为false,否则sanity检查会报缺少先前版本JDK的映像的错误提示。如果已经设置dev或者DEV_ONLY=true,这个不显式设置也行。

export SKIP_COMPARE_IMAGES=true

#使用预编译头文件,不加这个编译会更慢一些

export USE_PRECOMPILED_HEADER=true


# 64位jdk 
export ARCH_DATA_MODEL=64 

#要编译的内容

export  BUILD_LANGTOOLS=true

#export BUILD_JAXP=false

#export BUILD_JAXWS=false

#export BUILD_CORBA=false

export BUILD_HOTSPOT=true

export BUILD_JDK=true

#要编译的版本

#export SKIP_DEBUG_BUILD=false 
#export SKIP_FASTDEBUG_BUILD=true 
#export DEBUG_NAME=debug 

#把它设置成false可以避免javaws和浏览器Java插件之类的部分的build

export BUILD_DEPLOY=false

#把它设置成false就不会build出安装包,因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。

export BUILD_INSTALL=false

#编译结果所存放的路径

export ALT_OUTPUTDIR=/root/openjdk/build

CentOS编译OpenJDK_第9张图片

编译检查

进入之前解压缩的OpenJDK的根目录执行:make sanity

CentOS编译OpenJDK_第10张图片

检查通过后,执行make开始编译。我这里报了一个错


这是因为我这里使用的Ant版本是1.10.1,应该对应1.8版本jdk,而现在使用的jdk是1.7的,所以需要重新下载1.9版本及以下的Ant。

下载Ant,上传解压缩后,执行export ANT_HOME= /root/apache-ant-1.9.9

然后重新执行make,报了下面的错误

CentOS编译OpenJDK_第11张图片

解决方法是将CurrencyData.properties文件中所有的时间改为10年以内。

cd openjdk/jdk/src/share/classes/java/util/

vim CurrencyData.properties


编译完成后,输出如下的日志清单

CentOS编译OpenJDK_第12张图片

配置debug版jdk

编译完成后进入OpenJDK源码下的build/j2sdk-image目录(或者build-debug、build-fastdebug这两个目录),这是整个JDK的完整编译结果,复制到JAVA_HOME目录,就可以作为一个完整的JDK使用,编译出来的虚拟机,在-version命令中带有用户的机器名。

CentOS编译OpenJDK_第13张图片

修改JAVA_HOME变量为j2sdk-image的目录


CentOS编译OpenJDK_第14张图片

在大多数时候,如果我们并不关心JDK中HotSpot虚拟机以外的内容,只想单独编译HotSpot虚拟机的话(例如调试虚拟机时,每次改动程序都执行整个OpenJDK的Makefile,速度肯定受不了),那么使用源码中/root/openjdk/hotspot/make目录下的Makefile进行替换即可,其他参数与前面是一致的,这时候虚拟机的输出结果存放在/root/openjdk/build/hotspot/outputdir/linux_amd64_compiler2目录中,进入后可以看见以下几个目录。

CentOS编译OpenJDK_第15张图片

这些目录对应了不同的优化级别,优化级别越高,性能自然越好,但是输出代码与源码差距就越大,难于调试,具体哪个目录有内容,取决于make命令后面的参数。

在编译结束后,运行虚拟机之前,还要手工编辑/root/openjdk/build/hotspot/outputdir/linux_amd64_compiler2/jvmg目录下的env.sh(find -name env.sh查找文件)文件,这个文件由编译脚本自动生成,用于设置虚拟机的环境变量,里面已经发布了“JAVA_HOME、CLASSPATH、HOTSPOT_BUILD_USER”3个环境变量,还需要增加一个“LD_LIBRARY_PATH”,内容如下:

LD_LIBRARY_PATH=.:${JAVA_HOME}/jre/lib/amd64/native_threads:${JAVA_HOME}/jre/lib/amd64

export LD_LIBRARY_PATH

source env.sh

然后执行以下命令启动虚拟机(这时启动器为gamma),输出版本号。

. ./env.sh

./gamma -version



你可能感兴趣的:(Java,Linux)