最近在看《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》,决定自己来进行编译OpenJDK。
由于书中目前编译OpenJDK版本是7,已经与现在版本有点过时。
我选择的OpenJDK版本为8(虽然目前JDK版本已经到11了0.0)。
编译OpenJDK7和OpenJDK8有一些差异 ,需要注意一下。
比如:OpenJDK8 已经没有make sanity 。
网络有好多实例,可以进行查看。
在编译OpenJDK时,需要准备编译环境。
1. 系统环境(推荐Linux,还可以使用windows和Mac OS)
2. Bootstrap JDK jdk7(就是需要编译OpenJDK的java jdk环境,要比OpenJDK低一个版本,防止出现错误)
3. OpenJDK openJDK8 (需要编译的OpenJDK,目前版本是OpenJDK8)
OpenJDK 有两种下载方式,目前使用的是离线下载压缩包。
下载地址:http://jdk.java.net/java-se-ri/8 (根据自己需求进行下载)
1. 用虚拟机进行安装运行CentOS7。(也可以是别的Linux)
2. 卸载当前系统默认安装的OpenJDK,也就是系统默认安装的java环境。
通过: rpm -qa | grep java 查询默认安装JDK
通过:yum -y remove XXXXX (XXXX为查询出来的默认安装JDK)
3. 安装Bootstrap JDK (就是CentOS7 安装java,并配置环境变量)
运行 java -version 来进行确定有没有安装好java环境
4. 解压OpenJDK8
创建解压OpenJDK8目录(根据自己需求来进行创建,目前我创建目录为/usr/java/src/)
5. 安装编译OpenJDK8 依赖环境
yum groupinstall "Development Tools"
yum install libXtst-devel libXt-devel libXrender-devel
yum install cups-devel
yum install freetype-devel
yum install alsa-lib-devel
6. 编辑 /etc/profile,进行添加(编辑前记得备份)
#编译jdk需要设置的环境变量
#必须将 LANG设置为C
export LANG=C
#将我们刚刚解压的jdk配置到环境变量
export PATH="/software/java/jdk1.7.0_80/bin:${PATH}"
# 允许自动下载依赖
export ALLOW_DOWNLOADS=true
# 比较本次build出来的映像与先前版本的差异。
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
export BUILD_DEPLOY=false
# 把它设置为false就不会build出安装包。因为安装包里有一些奇怪的依赖
# 但即使不build出它也已经能得到完整的JDK映像,所以还是别build它好了
export BUILD_INSTALL=false
# 如果以前配置过这两个环境变量 一定要去掉
unset JAVA_HOME
unset CLASSPATH
编辑完/etc/proflie, 别忘记进行 source /etc/profile 来使环境变量生效
特别注意:
一定要配置
export LANG=C
unset JAVA_HOME
unset CLASSPATH
要不然会出现莫名其妙的这个错误。 比如
位置: 类型为Token的变量 token
/usr/java/src/openjdk/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:709: 错误: 找不到符号
error(token.pos, "fp.number.too.large");
^
符号: 变量 pos
位置: 类型为Token的变量 token
/usr/java/src/openjdk/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:714: 错误: 需要常量字符串表达式
case DOUBLELITERAL: {
^
/usr/java/src/openjdk/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:715: 错误: 找不到符号
String proper = token.radix() == 16 ?
^
符号: 方法 radix()
位置: 类型为Token的变量 token
100 个错误
gmake[1]: *** 没有规则可以创建“default”需要的目标“all”。 停止。
make: *** [langtools-only] 错误 2
另外因为环境变量配置export LANG=C,所以如果安装的系统是中文版本的,会让系统无法识别中文,甚至中文乱码。
所以在编译完后,如果怕出现中文乱码问题,还需要进行设置
运行:vim /etc/locale.conf 查看是不是 LANG=zh_CN.UTF8
如果不是,那么进行修改。如果是,不用修改,直接退出。
接着运行:source /etc/locale.conf 然后系统语言切换到中文。
7. 编译
修改解压OpenJDK目录下的configure文件权限
chmod +x configure 赋予可执行 权限
运行 ./configure --with-debug-level=fastdebug
#根据检测的信息,如果出现错误,按提示安装需要的依赖即可
#一切正常,会打印出如下信息,列举了当前的配置信息
A new configuration has been successfully created in
/software/java/my-openjdk/openjdk/build/linux-x86_64-normal-server-fastdebug
using configure arguments '--with-debug-level=fastdebug'.
Configuration summary:
* Debug level: fastdebug
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
Tools summary:
* Boot JDK: java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM
(build 24.80-b11, mixed mode) (at /software/java/jdk1.7.0_80)
* C Compiler: gcc (GCC) 4.4.7 20120313 (Red Hat-18) version 4.4.7-18) (at /usr/bin/gcc)
* C++ Compiler: g++ (GCC) 4.4.7 20120313 (Red Hat-18) version 4.4.7-18) (at /usr/bin/g++)
Build performance summary:
* Cores to use: 2
* Memory limit: 15951 MB
* ccache status: installed and in use
执行编译:make
上图为编译成功显示结果。
双线程cpu和1.5G内存配置编译时间30分钟 (上图配置)
四线程cpu和4G内存配置编译时间为10分钟 (后期测试)
如果为了编译快速,可以在编译的时候把虚拟机配置调高。
8. 测试编译
编译OpenJDK8没有出现太大问题,可能是因为环境已经集成很好了,唯一出现的问题就是本文中特别注意的问题。
后续就是对编译好的OpenJDK8的虚拟机JVM进行调试了。加油!!!
1. CentOS7上编译JDK8
2. Centos7 下编译 Openjdk8
3. centos7 编译 openjdk8
4. CentOS7上编译openjdk8步骤
5. 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码