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.) (7u95-2.6.-)
OpenJDK -Bit Server VM (build 24.95-b01, mixed mode)
在Ubuntu下安装OpenJDK7的方法很简单
直接运行如下命令:
sudo apt-get install openjdk--jre
sudo apt-get install openjdk--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--jre
sudo apt-get install openjdk--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的根目录
lxy@ubuntu: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脚本
lxy@ubuntu:openjdk$ bash configure
Running generated-configure.sh
configure: Configuration created at Wed Sep :: PDT .
configure: configure script generated at timestamp .
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: Tools summary:
* Boot JDK: java version "1.7.0_95" OpenJDK Runtime Environment (IcedTea 2.6.) (7u95-2.6.-) OpenJDK -Bit Server VM (build 24.95-b01, mixed mode) (at /usr/lib/jvm/java--openjdk-amd64)
* C Compiler: gcc- (Ubuntu 5.4.-6ubuntu1~16.04.) 5.4. version (at /usr/bin/gcc-)
* C++ Compiler: g++- (Ubuntu 5.4.-6ubuntu1~16.04.) 5.4. version (at /usr/bin/g++-) Build performance summary:
* Cores to use:
* Memory limit: MB
* ccache status: not installed (consider installing)
4. 运行make all
如果在一切顺利,在大概40分钟之后,JDK的整个编译会完成,你将会看到如下的消息。
----- Build times -------
Start -- ::
End -- ::
:: corba
:: demos
:: docs
:: hotspot
:: images
:: jaxp
:: jaxws
:: jdk
:: langtools
:: nashorn
:: TOTAL
-------------------------
5. 验证编译之后JDK
编译之后的JDK可执行文件都保存在JDK根目录的build/linux-x86_64-normal-server-release目录下,进入到到目录./build/linux-x86_64-normal-server-release/jdk/bin
运行如下命令
lxy@ubuntu:bin$ ./java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.-internal-lxy_2017_09_05_08_49-b00)
OpenJDK -Bit Server VM (build 25.40-b25, mixed mode)
那么恭喜你了,你的JDK成功编译,且能运行了,当然,你还可以写个简单的Java hello world运行一下 ^~^。
三、遇到的问题以及解决方法
1. 在运行bash ./configure时,遇到了类似如下的错误

正如我在“环境准备”那里提到的,根据提示安装相关包即可;
2. 运行make all时遇到操作系统不支持的错误
如图:

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

从这里看到,由于我当前的内涵是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虚拟机》
JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译的更多相关文章
- Python3.5 源码安装 Ubuntu16.04环境
安装源码编译所需的各种依赖库:(Ubuntu16.04环境下) sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-de ...
- 最全最详细:ubuntu16.04下内核编译以及设备驱动程序的编写(针对新手而写)
写在前面:本博客为本人原创,转载请注明出处!同时,本博客严禁任何下载站随意抓取!!! 本博客唯一合法URL: 总体考虑 要去写设备驱动程序,说白了就三大步骤:下载内核源码构建内核源码树(也就是下载你的 ...
- 个人从源码理解JIT模式下angular编译AppModule的过程
承接上文.笔者之前将一个angular项目的启动过程分为了两步: 创建平台得到 PlatformRef ,以及执行平台引用提供的方法编译根模块 AppModule .本文就将着眼于创建好的平台,从an ...
- Caffe学习系列(一)Ubuntu16.04下搭建编译Caffe环境,并运行MNIST示例(仅CPU)
前言: 正文: 1.安装必要依赖包: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev l ...
- QTimer源码分析(以Windows下实现为例)
QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...
- Openfire4源码部署到eclipse中并编译
Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...
- 【转】python:让源码更安全之将py编译成so
python:让源码更安全之将py编译成so 应用场景 Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效. python的解释特性是将py编译为独有的二 ...
- mybatis源码专题(1)--------复习jdbc操作,编译mybatis源码,准备为你的简历加分吧
本文是作者原创,版权归作者所有.若要转载,请注明出处.文章中若有错误和疏漏之处,还请各位大佬不吝指出,谢谢大家. 1.mybatis的底层是jdbc操作,我们来回顾一下,如下 运行以后的结果如下图: ...
- 【原创】Octovis在Ubuntu16.04下运行出现core dump的解决方案
本人SLAM研究新手,使用系统为Ubuntu16.04.本文原址:http://www.cnblogs.com/hitlrk/p/6667253.html 在学习SLAM的过程中,使用Octomap进 ...
随机推荐
- C语言基础 - 实现动态数组并增加内存管理
用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...
- Spring源码情操陶冶-ContextLoaderListener
前言:通过实例结合源码的方式解读,其中涉及到的文件来自于博主的Github毕设项目wxServer Note: Springboot应用不在本文章讨论范围 web.xml中启用Spring 在一般的w ...
- 【JAVASCRIPT】React + Redux
摘要 Redux 数据流图 View 层由React 控制, 根据state 变化 刷新渲染组件,作用是根据更新的数据重新渲染组件 Stroe 层其实就是state存储器,作用是更新数据 Dispat ...
- ES6中的类
前面的话 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScri ...
- Swift 细节
1.swift ?和 !的区别 1.1 Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使 ...
- Linux服务器中安装Oracle
笔者手动安装成功 一,oracle安装前的准备与配置 1,修改stsctl.conf文件 Linux是为小文件设计的,Oracle数据库安装需要占用较多资源,要把各项参数调大. 使用vi编辑/etc/ ...
- Shopex如何清理缓存
一.进入后台,点击 右上角 的"关于" 二.点击:缓存系统: 三.点击"清空缓存" 四.清除成功!
- 20. leetcode 171. Excel Sheet Column Number
Given a column title as appear in an Excel sheet, return its corresponding column number. For exampl ...
- HTML的学习笔记
一.HTML的概述(了解) a.html是什么 : hypertext markup language 超文本标记语言 超文本:音频,视频,图片称为超文本.. ...
- MySQL之增_insert-replace
MySQL增删改查之增insert.replace 一.INSERT语句 带有values子句的insert语句,用于数据的增加 语法: INSERT [INTO] tbl_name[(col_nam ...