> CentOS > CentOS教程 >

CentOS7下编译OpenJDK源码

在Centos7下自己编译openjdk源码,openjdk 
具体步骤:

  • 获取openjdk源码
  • 安装openjdk6–BoostrapJK
  • 安装编译时的依赖
  • 配置环境变量
  • 编译

1. 获取openjdk源码

可以到这里去下载,OpenJDK Source Releases 
我下载的是openjdk-7u40版本,openjdk7,update40,build43

2. 下载jdk6–BoostrapJDK

我使用jdk6来辅助编译。可以到oracle官网下载,jdk-6u45-linux-x64.bin

3.安装编译时的依赖

可以使用以下命令一次安装完成

yum -y install build-essential gawk m4
openjkd-6-jkd libasound2-dev libcups2-dev 
libxrender-dev xorg-dev xutils-dev
xllproto-print-dev binutils libmotif3
libmotif-dev ant

3.配置环境变量,编译

OpenJKD在编译时读取的环境变量很多,但是大多数都有默认值,必须设置的只有两个:LANG和ALT_BOOTDIR。分别为C跟bootJDK的路径 
所有的环境变量可以使用下面的脚本设置:


export LANG=C
#Bootstrap JDK 安装位置
export ALT_BOOTDIR=/opt/openJDK/jdk1.6.0_45

#允许自动下载
export ALLOW_DOWNLOADS=true
#并行编译的线程数,和CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=2
export ALT_PARALLEL_COMPILE_JOBS=2

#比较本次build出来的映像与先前版本的差异,对于我们没哟意义,
#必须设置为false
export SKIP_COMPARE_IMAGES=true

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

#要编译的内容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true

#把它设置为false,可以避开javaws和浏览器java插件的build
BUILD_DEPLOY=false

#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖
BUILD_INSTALL=false

#编译结果所存放的路径
export ALT_OUTPUTDIR=/opt/openJDK/openjdk/build

#这两个变量必须去掉
unset CLASSPATH
unset JAVA_HOME
unset LD_LIBRARY_PATH

全部设置结束之后,可以输入 make sanity 检测是否正确,如果一切顺利,会输出:Sanity check passed.就可以编译了。  输入make(不加参数默认为make all),我的虚拟机配置比较低,整个编译的过程用了一个多钟。

结果如下: 

  我在虚拟机中编译的,而且配置不高,所以有点慢.

那么问题来了,如何看结果ne?

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

[root@localhost ~]# java -version
openjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-root_2016_04_25_20_00-b00)
OpenJDK 64-Bit Server VM (build 24.0-b56-jvmg, mixed mode)

  大多数情况我们只关心Hotspot虚拟机,只想单独编译它的话,那么使用hotspot/make目录下的MakeFile进行替换即可,其他参数与前面一致,这时候虚拟机的输出结果存放在 
build/hotspot/outputdir/linux_amd64_compiler2 中,里面对应了不同的优化级别的目录。

进入 目录jvmg,在运行虚拟机前,还要手工编辑目录下的env.sh文件,这个文件由编译脚本自动产生,用于设置虚拟机的环境变量,里面已经发布了”JAVA_HOME,CLASSPATH,HOTSPOT_BUILD_USER” 3个环境变量,还需要增加一个“LD_LIBRSRY_CLASSPATH”:

{% codeblock lang:Java %} 
LD_LIBRARY_PATH=.:JAVAHOME/jre/lib/amd64/nativethreads:{JAVA_HOME}/jre/lib/amd64:/opt/openJDK/openjdk/build/hotspot/outputdir/linux_amd64_compiler2/product
export LD_LIBRARY_PATH 
{% endcodeblock %}

然后执行

. ./env.sh
./gama -version   #有可能是test_gamma,这是自带的一段八皇后代码

结果如下 

  自己编译的虚拟机成功运行起来,哈哈哈~ 


编译过程中有可能报错:

Error: time is more than 10 years from present: 1104530400000 when building java/openjdk* lists.freebsd.org

通过修改CurrencyData.properties文件, 把10年之前的时间修改为10年之内即可 
Index: /usr/openjdk/jdk/src/share/classes/java/util/CurrencyData.properties 
把2006改掉就可以重新编译了




(责任编辑:IT)