在Ubuntu16.04下编译OPENJDK8
最近在看一本书《Java虚拟机精讲》,该书第一章简单介绍了java基础知识后,便开始讲解自己编译JDK,书中使用的是OPENJDK7来进行讲解的。于是我选择了最新的OPENJDK8来学习编译。
编译准备
- 下载OPENJDK8
- 老实说,我没有在openjdk网站上找到openjdk8的源码下载地址。只找到6和7的
- 最后在一篇博客上找到的,http://download.java.net/openjdk/jdk8/(感谢。)
- 编译系统选择
- 首先java是跨平台的,理论上应该在各大系统平台下应该都能编译
- 不过,win下向来比较麻烦,易错,不建议使用
- 笔者有linux环境,选用系统Ubuntu16.04
- 构建工具
- 首先,如果你英文水平可以,读到这里可以结束了,可以直接参考源码文件中的文件README-build.html,该说明很清晰地描述了编译中的系统环境设置、工具使用等等。但是描述很简单,需要有一定的自信,相信自己可以搞定。
- 如果,你属于另外一类,可以继续阅读本文。
- 下面开始building,分为System Setup,Configure,Make三个小节进行描述
编译过程
System Setup(我的环境是Ubuntu16.04)
对于所有的系统,都需要以下几个要求
- GNU make的版本3.81以上.
- 可以使用命令make -version查看机器的make版本。一般Ubuntu已经默认安装了较新版本的GNU MAKE,笔者的版本是GNU Make 4.1,显然满足最低要求。如果你的版本低了,可以自行更新GNU Make。
- 安装一个Bootstrap JDK,构建jdk8,需要jdk7 update或者更新。jdk8不能使用jdk8作为boot jdk。
- Bootstrap JDK,也叫Boot JDK,字面意思就是引导JDK,也即你编译某一个版本的JDK需要依赖一个低版本的JDK。通常是编译JDK8就需要JDK7来做boot jdk,(笔者猜想)可能新版本的某些更新就是基于老版本的方法,你编译新版本的jdk时,必须保证调用的方法全都存在。(/笔者猜想)
- 如何安装?ubuntu 软件源已经将openjdk7移除,所以需要自己添加源,并update、install,具体请参考博客http://blog.csdn.net/chenzhao2013/article/details/53671160
- 安装完boot,需要设置少量的环境变量
- export LANG=C
- export PATH=”/usr/lib/jvm/java-1.7.0-openjdk/bin:${PATH}”
- 上面路径是你的boot jdk的安装路径,你需要自行查看路径,一般是安装在、usr/jvm下,需要寄几确认路径是否正确。
确认GNU Make、GNU Gcc和Boot JDK在环境变量中。
- 简单确认方法,分别命令行输入以下命令,如果正确输出版本,即可认为环境变量设置成功
- make -v
- gcc -v
- java -version
- 简单确认方法,分别命令行输入以下命令,如果正确输出版本,即可认为环境变量设置成功
注意,如果你以前已经在系统中设置了java_home,记得unset(注释掉)。一般Ubuntu系统预先给你设置了环境变量。均需要UNSET。
- GNU make的版本3.81以上.
- 在linux系统下,还需要其他的工具,alsa,freetype,cups,and xrender.这些工具可以暂时不安装,在执行make指令时,如果缺少库,会提醒你进行安装,笔者就是这样。。。
- Configure
- 一般执行命令类似这样BASH: ./cond=figure [OPTIONS]
- 执行命令的目的是检测环境设置是否正确,是否能够进行下去
- 也会指定一个编译的输出文件路径
- 笔者的configure文件一开始不能执行,提示权限不够。需要加上可执行权限,命令:chmod +x configure
- OPTIONS参数,可以设置很多,我这里一个都不说,需要的自己去查一下README-build.html,不加这个参数也可以,因为有点不太需要,全部默认即可。笔者就是直接执行命令./configure
- Make
- make就是用来编译的
- 执行指令: make
- 如果因为错误,停止,try: make -i(忽略错误)
- make 后也可以跟参数,如:all,all-conf等。
- 博客一开始提到的那本书说,如果默认参数编译jdk,可能需要一个小时,笔者什么参数都没有设置,直接make,后显示只用了5分28秒。后来发现是编译有问题。。。
- 结果输出如下:
- 我的问题
- 编译结束后,我查看了log,发现里面存在error,???我也不明白。
- 但是在编译好的jdk下bin目录下,执行./java -version,能够输出编译的java版本。
问题交流
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流
致谢
- 本文是在阅读《Java虚拟机精讲》时,写的博客,感谢高老师。