JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译

笔者最近在学习周志明老师编写的《深入理解Java虚拟机》一书,书中第一章的实战部分就是“自己编译JDK”,不过书中提到的是OpenJDK 7的编译。由于现在Java开发主流的JDK基本都是1.8的版本,所以,笔者就进行了OpenJDK 8的编译。

 (本文为博主原创文章,转载请注明出处)

一、环境准备

1. 操作系统

笔者用的是Ubuntu 16.04.2 LTS (GNU/Linux 4.8.0-36-generic x86_64),当然其他debian的Linux操作系统,理论上也可以;

2. 安装Bootstrap JDK

由于我们编译的是OpenJDK 8,所以,Bootstrap JDK最好采用OpenJDK 1.7版本的,笔者安装的是

java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

在Ubuntu下安装OpenJDK7的方法很简单

直接运行如下命令:

sudo apt-get install openjdk-7-jre
sudo apt-get install openjdk-7-jdk

如果出现“没有可用的软件包 openjdk-7-jdk,但是它被其它的软件包引用了。这可能意味着这个缺失的软件包可能已被废弃, 或者只能在其他发布源中找到,E: 软件包 openjdk-7-jdk 没有可安装候选”,可以按照一下操作安装1.7.X版本

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jre
sudo apt-get install openjdk-7-jdk

3. 下载OpenJDK 8的源码下载

笔者尝试从官网下载,但是,奈何没找到下载的地方(找到的相关链接上都无法下载了,只能通过hg从代码库check out,但是,这样太费时,因为代码库在国外),于是最后在CSDN上有人提供了源码的下载,如果你不想再去费力气找源码,我提供一个百度网盘的链接,有需要的同学可以去下载。

链接:http://pan.baidu.com/s/1hr9IV3m

密码:2vb5

4. 相关依赖包的安装

由于JDK在编译的过程中会依赖一些外部的包,所以,最好是编译前就装好。当然,如果你没有在编译前装好,在你运行./configure的时候,这个脚本会进行环境的检查,当检查到失败的时候,缺什么再安装什么也可以,不过就是费时间些。

以下是我在安装过程中发现缺少并安装的包,仅供参考,可能不同的OS缺少的包可能不一样:

sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
sudo apt-get install libcups2-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libasound2-dev

二、编译

好的,现在编译JDK的环境已经准备好了,咱们可以开始进行编译了。

1. 将OpenJDK 8的源码包上传到OS的任意目录

2. 进入OpenJDK 8的根目录

[email protected]:openjdk$ ls
a.out               build   configure  get_source.sh  jaxp   jdk        LICENSE  Makefile  README              test
ASSEMBLY_EXCEPTION  common  corba      hotspot        jaxws  langtools  make     nashorn   README-builds.html  THIRD_PARTY_README

3. 运行根目录下的configure脚本

[email protected]:openjdk$ bash configure
Running generated-configure.sh
configure: Configuration created at Wed Sep  6 05:49:02 PDT 2017.
configure: configure script generated at timestamp 1416326200.
checking for basename... /usr/bin/basename
checking for bash... /bin/bash
checking for cat... /bin/cat
checking for chmod... /bin/chmod
..............................  省略
====================================================
A new configuration has been successfully created in
/home/lxy/jdk-src/openjdk/build/linux-x86_64-normal-server-release
using default settings.

Configuration summary:
* Debug level:    release
* 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_95" OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3) OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)  (at /usr/lib/jvm/java-7-openjdk-amd64)
* C Compiler:     gcc-5 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 version 20160609 (at /usr/bin/gcc-5)
* C++ Compiler:   g++-5 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 version 20160609 (at /usr/bin/g++-5)

Build performance summary:
* Cores to use:   1
* Memory limit:   1981 MB
* ccache status:  not installed (consider installing)

4. 运行make all

如果在一切顺利,在大概40分钟之后,JDK的整个编译会完成,你将会看到如下的消息。

----- Build times -------
Start 2017-09-05 09:13:03
End   2017-09-05 09:49:47
00:01:05 corba
00:01:10 demos
00:05:09 docs
00:16:08 hotspot
00:01:48 images
00:00:36 jaxp
00:00:52 jaxws
00:09:23 jdk
00:00:00 langtools
00:00:32 nashorn
00:36:44 TOTAL
-------------------------

5. 验证编译之后JDK

编译之后的JDK可执行文件都保存在JDK根目录的build/linux-x86_64-normal-server-release目录下,进入到到目录./build/linux-x86_64-normal-server-release/jdk/bin

运行如下命令

[email protected]:bin$ ./java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-lxy_2017_09_05_08_49-b00)
OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode)

那么恭喜你了,你的JDK成功编译,且能运行了,当然,你还可以写个简单的Java hello world运行一下 ^~^。

三、遇到的问题以及解决方法

1. 在运行bash ./configure时,遇到了类似如下的错误

正如我在“环境准备”那里提到的,根据提示安装相关包即可;

2. 运行make all时遇到操作系统不支持的错误

如图:

从错误中容易看出,应该是内核版本和JDK要求的内核版本不一致造成的。根据错误,找到对应的Makefile(

/home/lxy/jdk-src/openjdk/hotspot/make/linux/Makefile)文件,259行

从这里看到,由于我当前的内涵是4开头的,所以在此处报错。我的解决方法是,直接把这里的SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%改成了SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%,即添加了对4开头的版本的支持。修改之后再运行make all之后便没有再出现报错了。

四、总结

整个OpenJDK 8的编译过程中,比笔者想象的要简单很多。如果有些不对或者有问题的地方,欢迎提出来一起讨论。

参考:

README-builds.html  --> 此文档是OpenJDK源码中自带的,比较全面

http://blog.csdn.net/u010856630/article/details/51660012

《深入理解Java虚拟机》

时间: 2024-10-13 06:30:11

JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译的相关文章

Caffe学习系列(一)Ubuntu16.04下搭建编译Caffe环境,并运行MNIST示例(仅CPU)

前言: 正文: 1.安装必要依赖包: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler sudo apt-get install --no-install-recommends libboost-all-dev sudo apt-get install libatlas-base-dev sudo apt-get

《python源码剖析》笔记 Python的编译结果

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.python的执行过程 1)对python源代码进行编译,产生字节码 2)将编译结果交给python虚拟机,由虚拟机按照顺序一条一条地执行字节码,产生执行结果 图7-1 2.Python编译器的编译结果--PyCodeObject对象 Python编译器的编译结果中包含了字符串.常量值.字节码等在源代码中出现的一切有用的静态信息. 在Python运行期间,这些静态信息被PyCodeOb

《java.util.concurrent 包源码阅读》04 ConcurrentMap

Java集合框架中的Map类型的数据结构是非线程安全,在多线程环境中使用时需要手动进行线程同步.因此在java.util.concurrent包中提供了一个线程安全版本的Map类型数据结构:ConcurrentMap.本篇文章主要关注ConcurrentMa接口以及它的Hash版本的实现ConcurrentHashMap. ConcurrentMap是Map接口的子接口 public interface ConcurrentMap<K, V> extends Map<K, V> 与

【原创】Octovis在Ubuntu16.04下运行出现core dump的解决方案

本人SLAM研究新手,使用系统为Ubuntu16.04.本文原址:http://www.cnblogs.com/hitlrk/p/6667253.html 在学习SLAM的过程中,使用Octomap进行八叉树地图的建立,Octomap的编译安装没有出现问题,octovis模块也顺利安装.悲催的是,在我调用octovis模块打开已有的八叉树地图时,便会出现一大堆乱码,乱码最后有一个Core Dump. 这个错误和2016年时g2o_viewer在Ubuntu16.04下出现的错误一样,不过目前g2

ubuntu16.04下安装artoolkit5

目前对AR技术的常见理解就是CV(Computer Vision)+CG(Computer Graphic).CV的方法很多,简单些比如FREAK+ICP(ARToolKit中的NFT),复杂些就是SLAM(Magic Leap).CG就没什么好说的,利用CV算法获取到的图形相关信息(比如CG中的模型矩阵.视图矩阵.投影矩阵)进行绘制.从这一点上来说Pokemon GO确实不能算作AR游戏,毕竟人家只是基于LBS的. 从目前来看vision based的AR系统才是主流.但是局限于我个人的见识,

Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += -g QMAKE_LINK += -g 在终端输入 ulimit -c 显示为 0 然后输入 ulimit -c unlimited 继续在终端运行编写的程序 出错后,会在当前目录生成 core 文件 然后在终端执行 “gdb 你的程序名 core” 然后输入 bt 对该错误进行跟踪调试 (gdb)

ubuntu16.04下安装sourcesinsight

参考: https://blog.csdn.net/qq_22122811/article/details/66975946 参考1:http://blog.csdn.net/yunfeiyang62/article/details/46662633 参考2:http://blog.csdn.net/imyang2007/article/details/7654700    习惯了在source insight下编辑阅读源码,在linux下用vi总是用不好 ,还是在ubuntu上用回熟悉的sou

ubuntu16.04下sublime text3安装和配置

ubuntu16.04下sublime text3安装和配置 2018年04月20日 10:31:08 zhengqijun_ 阅读数:1482 1.安装方法 1)使用ppa安装 sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt-get update sudo apt-get install sublime-text-installer 卸载 sublime text 命令: sudo apt-get remove s

ubuntu16.04下安装petalinux

ubuntu16.04下安装petalinux 参考https://www.cnblogs.com/vacajk/p/6146146.html 安装环境: 1. ubuntu 16.04 2. petalinux-v2015.4 3. 目标板:zynq 7010 SOC 安装步骤: 1. 在home目录下新建两个文件夹:petalinux和petalinux_installer两个文件夹,将安装包petalinux-v2015.4-final-installer-dec.run放到文件夹peta