说明:笔者是在Ubuntu 16.04虚拟机中编译 OpenJDK 8

源码下载

http://download.java.net/openjdk/jdk8/

推荐直接下载openjdk-8-src-b132-03_mar_2014.zip

环境准备:

安装bootstrap JDK,笔者安装的jdk7

在环境变量PATH中添加jdk的bin目录,不添加的话,在编译第一步时需要带参数

解压后阅读README-builds.html,按照要求安装Linux环境需要的软件。不清楚要安装哪些,在编译第一步失败的时候会提示你安装。

#如果之前有设置的话,这两个环境变量需要去掉,不然会出问题。

unset JAVA_HOME

unset CLASSPATH

编译

切换到解压后目录

第一步:

bash ./configure

或者带jdk目录,path为bootstrap JDK的目录

bash ./configure --with-boot-jdk=path

第二步:

make all

*遇到的坑爹问题

1,版本问题,recipe for target 'check_os_version' failed

方案一:直接注释检查

nano hotspot/make/linux/Makefile

 check_os_version: 

#ifeq($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),) 

#   $(QUIETLY) >& echo "*** This OS is not supported:" `uname -a`; exit ; 

#endif 

方案二:添加版本支持

nano hotspot/make/linux/Makefile

SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% % %

2,make参数语法,添加'I'

nano hotspot/make/linux/makefiles/adjust-mflags.sh
# line . (新版本make语法有变动)
s/ -\([^ I][^ ]*\)j/ -\ -j/

3,undefine symbols错误

提升一个模板函数定义至头文件,避免出现undefined symbols错误。

# 将 hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp 中的template <class T> void write_ref_array_pre_work(T* dst, int count)方法,提升到对应的
头文件g1SATBCardTableModRefBS.hpp中。
# 模板函数定义需要出现在头文件中,以便编译器为其生成特化版本。若无此修改,运行编译后的java程序,将出现undefine symbols错误。

编译成功标识

验证

1,the build result. This directory typically looks like:

build/linux-x64-normal-server-release

2,JDK输出目录:

In particular, the build/*/images/j2sdk-image/bin directory should contain executables for the OpenJDK tools and utilities for that configuration.

3,查看版本

3.1直接在bin目录下运行  ./java -version

3.2将编译好的JDK复制到适当目录,配置JAVA_HOME指向该目录,使环境变量生效后,执行java -version命令,就能看到带用户机器名的jdk版本。

cp build/linux-x86_64-normal-server-release/images/j2sdk-image/ -r /usr/lib/jdk/openjdk8
sunil@ubuntu:~/Downloads/openjdk$ java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.-internal-sunil_2016_11_21_18_06-b00)
OpenJDK -Bit Server VM (build 25.0-b70, mixed mode)
sunil@ubuntu:~/Downloads/openjdk$

参考文档

README

深入理解Java虚拟机(第2版)

https://blog.mlworks.cn/tech/compile-openjdk8-ubuntu-16.04.html

OpenJDK 编译-Linux环境的更多相关文章

  1. Linux环境PostgreSQL源码编译安装

    Linux环境PostgreSQL源码编译安装 Linux版本: Red Hat 6.4 PostgreSQL版本: postgresql-9.3.2.tar.gz 数据存放目录: /var/post ...

  2. Linux环境编译动态库和静态库总结

    对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...

  3. QWT编译与配置-Windows/Linux环境

    QWT编译与配置-Windows/Linux环境 QWT和FFTW两种开源组件是常用的工程软件支持组件,QWT可以提供丰富的绘图组件功能,FFTW是优秀数字波形分析软件.本文使用基于LGPL版权协议的 ...

  4. Linux环境下使用VSCode编译makefile文件的注意事项

    Linux环境下使用VSCode编译makefile文件的注意事项 首先安装C/C++的两个依赖 在debug,launch会自动的生成下方的launch.json launch.json { // ...

  5. linux环境下安装git(采用github下载git源码编译)

    [目的]:linux环境下 安装配置git成功 [准备条件]linux系统,git包 1.先行下载git包 -- 从github上https://github.com/git/git/releases ...

  6. Linux 环境下 C++ 的开发编译

    Linux环境下C++程序的开发编译学习笔记 环境:vmware 运行下的Ubuntu 16.04 姓名:谢津 时间:2018/5/24 内容:1)vim的安装及配置:2)第一个C++程序的编写与编译 ...

  7. PCL库在Linux环境下的编译安装

    PCL库在Linux环境下的编译安装 PCL库的源码库:https://github.com/PointCloudLibrary/pcl 下载完了之后解压下来 编译库的几个步骤 mkdir build ...

  8. Linux环境下使用gcc编译,gdb反汇编C语言程序

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  9. [转载]Linux 环境下编译 0.11版本内核 kernel

    最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...

随机推荐

  1. C++-数据库【1】-C++连接MSSQL数据库

    测试环境—— 系统:Win7 64bit 编译器:VC++ 2015 数据库:MSSQL 2008 R2 #include <Windows.h> #include <stdio.h ...

  2. 【总结】C# Access 数据库 增删查改 的简单步骤

        引用集: using System.Data.OleDb; static string exePath = System.Environment.CurrentDirectory;//本程序所 ...

  3. css 浅析display属性

    继续开始我的css之旅吧.今天我们来说什么啊.构思了两天还是没有什么思路,但是学习的步伐我们不能停止下来.还是按照之前的计划来讲讲display,在讲这个之前我们还是按照老规矩来扯扯蛋,步子不能够迈大 ...

  4. Rust语言的多线程编程

    我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...

  5. 转载:Chrome调试折腾记_(1)调试控制中心快捷键详解!!!

    转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致…按下F12;还是熟悉的味道;  或者直接 Ctrl ...

  6. OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序

    1.先把OC的类分清楚各有什么方法 普通类的方法 init initialize: 控制器类的方法 init initialize: initWithCoder: UI控件类的方法 init init ...

  7. 关于tableviewcell的一些必备常识

    1.设置tableview的背景颜色当设置tableview.backgroundcolor无效时,这样设置: UIView *view    = [[UIView alloc] initWithFr ...

  8. Code of Conduct

    v

  9. 为什么我如此热爱这样一个比赛(转自vici)

    为什么我如此的热爱这样一个比赛呢?因为它总能带给我一个目标,让我去努力实现它.因为可以看到胜利的希望,于是不断的去追逐.虽然其中的过程可能是比较艰辛的.   对于天才选手,作为天生的冠军,大概凭借天赋 ...

  10. jQuery extend扩展String原型

    jQuery.extend(String.prototype, { isPositiveInteger:function(){ return (new RegExp(/^[1-9]\d*$/).tes ...