自己动手编译OPENJDK

自己编译JDK(macOS)

1. 获取JDK源码

官网提供了两种下载方式:

  1. 通过Mercurial版本控制工具下载(http://hg.openjdk.java.net/);

  2. 通过官网提供的压缩包下载并解压(目前只提供了jdk6的版本):http://download.java.net/openjdk/jdk6。

由于一些版本问题,踩过坑后,笔者毅然采取了第一种方式,下载了jdk7u版本( hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/ ),如果没有安装Mercurial,请先安装一下。

下载好后,可以参考README-builds.html文档,里面有很多需要注意的细节。官方文档称编译jdk需要很高的专业技术,Sun提供了jdk源码是为了技术专家进行研究之用。虽然没有这么夸张,但还是要注意细节。

2. 构建编译环境

  1. 需要安装最新版本的XCode和Command Line Tools for XCode。这两个SDK包提供了OpenJDK所需要的编译器以及Makefile中用到的外部命令。

  2. 需要准备一个6u14以上版本的JDK,因为OpenJDK的各个组成部分有的使用C++编写,更多代码则是使用Java自身实现的,因此编译这些代码需要一个可用的JDK,官方称这个SDK为“Bootstrap JDK”。

3. 进行编译

下面直接贴上Shell脚本,读者可参考注释内容。

#语言选项,这个必须要配置,否则编译后会出现一个Hashtable的NPE错误。
export LANG=C
#Bootstrap JDK的安装路径。
export ALT_BOOTDIR=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
#允许自动下载依赖
export ALLOW_DOWNLOAD=true
#并行编译的线程数,设置为和CPU内核数量一致即可,通过 关于本机-系统报告-核总数 可查看
export HOSTPOT_BUILD_JOBS=2
export ALT_PARALLEL_COMPILE_JOBS=2

#比较本次bulid出来的映像和之前版本的差异。这对我们第一次编译来说没有意义
#因此设置为true,否则sanity检查会报缺少先前版本JDK映像的错误提示
export SKIP_COMPARE_IMAGES=true

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

#要编译的内容
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=true
#export DEBUG_NAME=debug

#将它设置为fasle,可以避开javawa和浏览器Java插件之类的部分的build
BUILD_DEPLOY=false

#将它设置为false就不会build出安装包,因为安装包里面有奇怪的依赖
#但即使不build它也已经能得到完整的jdk映像了
BUILD_INSTALL=false

#编译结果存放的路径
export ALT_OUTPUTDIR=/Users/wangjun/Downloads

#这两个环境变量必须去掉,不然会有很诡异的事情发生
unset JAVA_HOME
unset CLASSPATH

#先执行make sanity,显示Sanity check passed.成功后再执行make 2>&1 | tee $ALT_OUTPUTDIR/build.log
#make sanity
#make 2>&1 | tee $ALT_OUTPUTDIR/build.log

4. 可能遇到的错误以及解决办法

1. make sanity的时候报错:

解决方案:这个错误是由于忘记安装ant了,安装ant即可

2. make sanity的时候报错:

解决方案:

The Compiler version is undefined. 原因是Xcode5.0之后不再提供llvm-gcc与llvm-g++这两样东西,编译jdk是需要这两个所以一直出错。

解决方法是在XCode的安装目录下/Applications/Xcode.app/Contents/Developer/usr/bin 做一个ln -s的链接连到/usr/bin的 llvm-g++ llvm-gcc中

例子:

FreeType version 2.3.0 or higher is required. 的原因是freetype的版本太低或者没有安装freetype。

使用brew重新安装freetype最新版本:

然后更新环境变量:

重新make sanity就可以了。

3. 编译时报错

解决方案:

安装jdk7版本,并更新

4. 编译时报错

解决方案:

因为一开始没有在环境变量面去设置,所以要在环境变量里面加上

5. 编译时报错

解决方案:

clang不支持参数-fpch-deps

首先查到哪个文件用到了

6. 编译失败,形参默认值问题

报错

解决方法

7. 编译失败

解决方案:

8.编译失败,找不到对应的类库和方法

解决方案:

/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources

下面的libJPEG.dylib拷贝到

/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib

下面,覆盖掉之前的libjpeg.dylib。

9.编译失败,

解决方案:

Last updated

Was this helpful?