CentOS7编译JDK8,JVM虚拟机

引言

 最近在看《深入理解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

CentOS7编译JDK8,JVM虚拟机_第1张图片

上图为编译成功显示结果。

双线程cpu和1.5G内存配置编译时间30分钟 (上图配置)

四线程cpu和4G内存配置编译时间为10分钟 (后期测试)

如果为了编译快速,可以在编译的时候把虚拟机配置调高。

8. 测试编译

CentOS7编译JDK8,JVM虚拟机_第2张图片

后记

编译OpenJDK8没有出现太大问题,可能是因为环境已经集成很好了,唯一出现的问题就是本文中特别注意的问题。

后续就是对编译好的OpenJDK8的虚拟机JVM进行调试了。加油!!!

 

 参考

1. CentOS7上编译JDK8

2. Centos7 下编译 Openjdk8

3. centos7 编译 openjdk8

4. CentOS7上编译openjdk8步骤

5. 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码

你可能感兴趣的:(JVM,JVM,CentOS7,OpenJDK8,编译JDK)