一、获取JDK8源码
两种方式获取源码
1.直接从openjdk资源库clone
yum install hg
克隆项目
hg clone http://hg.openjdk.java.net/jdk8/jdk8 my-open-jdk8
下载源码
cd my-open-jdk8
./get_source.sh
经测试这种方式相当慢。。不推荐
2.直接下载源码包zip格式,比较快 推荐
wget http://download.java.net/openjdk/jdk8u40/ri/openjdk-8u40-src-b25-10_feb_2015.zip
二、安装依赖,配置编译环境
1.README-builds 文档中列举的一些需要的依赖:
- 机器内存最少1GB 磁盘空间最少6GB
- Development Tools(也就是gcc make等一些工具,gcc版本要求3.7以上 freetype-devel 要求2.3以上)
- Java Development ,也就是bootstrap jdk,必须是jdk7 , 版本最低为 JDK 7u7,因为jdk源码中有些功能是用java写的,所以编译中间需要用到java环境,就称为bootstrap jdk ,如果编译jdk7就用jdk6作为bootstrap jdk
- X Software Development (可能是编译出win的安装包需要这个)
- cups devel: Cups Development Package
- alsa devel: Alsa Development Package
- Xi devel: libXi.so Development Package
2.安装这些依赖环境,推荐使用yum安装,比较方便:
- yum -y install libX11-devel freetype-devel
- yum -y groupinstall 'Development Tools'
- yum -y install alsa*
- yum -y install cups-devel ccache
3.配置编译环境
需要一个jdk7作为bootstrap jdk 解压备用
wget http://219.238.7.67/files/400800000A25538B/download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz
编辑/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
编译JDK8同编译JDK7不同 , 废弃了一些 ALT_ 的一些参数
例如: HOTSPOT_BUILD_JOBS、ALT_PARALLEL_COMPILE_JOBS、ALT_OUTPUTDIR 无需再设置
三、开始编译
解压源码,cd到源码目录 。执行./configure ,笔者加了个参数开启了debug模式
- [root@iZ2ze1np3s3kfsddhxqr0gZ openjdk]#./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
如果alsa freetype boot-jdk 等依赖不是yum装的 或者没有加入到环境变量,则需要configure参数来指定安装位置
执行编译
- [root@iZ2ze1np3s3kfsddhxqr0gZ openjdk]#make
等待20分钟左右,编译成功在build目录下生成 linux-x86_64-normal-server-fastdebug目录
测试下:
- [root@iZ2ze1np3s3kfsddhxqr0gZ build]# cd linux-x86_64-normal-server-fastdebug/jdk/bin/
- [root@iZ2ze1np3s3kfsddhxqr0gZ bin]# ./java -version
- openjdk version "1.8.0-internal-fastdebug"
- OpenJDK Runtime Environment (build 1.8.0-internal-fastdebug-root_2017_09_14_14_16-b00)
- OpenJDK 64-Bit Server VM (build 25.0-b70-fastdebug, mixed mode)
- [root@iZ2ze1np3s3kfsddhxqr0gZ bin]#
四、附 录
关于configure的一些参数说明:
--enable-debug 开启dubug模式
--with-debug-level=
level debug模式的等级
--with-alsa=
path 添加依赖,指定alsa的位置(yum安装的alsa不需要用这个指定)
--with-boot-jdk=
path boot-jdk的位置(我们已配置到环境变量也无需指定)
--with-boot-jdk-jvmargs=
"args" boot-jdk的jvm参数
--with-cups=
path cups的位置
--with-freetype=
path freetype的位置
--with-target-bits=
arg 如果编译32位 可指定为32
--with-memory-size=
size 指定GNU编译时 所需的RAM大小
更多请参考 : README-builds
编译中出现的错误:
- Generating beaninfo
- Generating Nimbus source files
- [Error] encoded value was less than 0: encode(-8.326673E-17, 5.0, 11.0, 16.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
- [Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
- [Error] Encountered Infinity: encode(-0.00877193, 0.0, 7.0, 7.0)
查询下,这是个官方的bug,似乎不影响结果 : https://bugs.openjdk.java.net/browse/JDK-8016451
资源下载:
编译参考文档:http://openjdk.java.net/groups/build/
转载请注明:左手代码右手诗 » CentOS7上编译JDK8