在Ubuntu 16.04上编译OpenJDK8的源代码(配视频)

在Ubuntu 16.04上编译OpenJDK8的源代码(配视频)

本文将详细介绍在Ubuntu16.04 LTS上对OpenJDK8进行编译,为了方便大家快速搭建起OpenJDK8的调试开发环境,我还录制了对应的视频放到了B站上,大家可以参考。

视频地址:https://space.bilibili.com/27533329

下面我们开始环境的搭建过程。

1、准备编译环境

使用的操作系统为Ubuntu16.04 LTS(LTS:Long Term Support,长期演进版,Ubuntu会对这一版本的支持时间更长。目前Java也在运用这种方式),如果读者没有安装Ubuntu,可以在Windows上使用虚拟机的方式进行安装,或者可以直接在电脑上安装多系统,这种方式比以虚拟机安装的方式速度要快。Ubuntu操作系统使用的是Linux内核,由于HotSpot是由C++编写的,所以在编译时需要Linux的编译器GCC。

OpenJDK使用的代码管理工具为Mercurial(hg),下载并安装Mercurial后就可以通过hg clone命令获取OpenJDK8的源代码了,相关的命令如下: 

hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk
cd openjdk
bash ./get_source.sh

使用Mercurial下载时速度相对较慢,可以直接去相关网站上下载压缩包,网址为:http://download.java.net/openjdk/jdk8。笔者下载的压缩包为openjdk-8-src-b132-03_mar_2014.zip,使用如下命令对压缩包进行解压: 

unzip openjdk-8-src-b132-03_mar_2014.zip

解压后openjdk目录下重要的目录如下表所示。

<span>在Ubuntu 16.04上编译OpenJDK8的源代码(配视频)</span> 

openjdk中的README-builds.html网页提供了编译源代码的相关说明。在Ubuntu操作系统下编译可以分为两步:

第一步,生成编译配置的脚本 

生成编译配置的脚本使用的命令如下: 

bash ./configure  \
--with-target-bits=64 \
--with-boot-jdk=/home/mazhi/workspace/jdk1.7.0_72/ \
--with-debug-level=slowdebug \
--enable-debug-symbols ZIP_DEBUGINFO_FILES=0

运行这个命令对编译的openjdk所需要的依赖进行检查,如果终止,可根据对应的提示安装相关的依赖。命令行选项–with-target-bits指定编译64位系统的JDK; 命令行选项–with-boot-jdk指定引导JDK所在目录,以防其他安装的JDK影响。构建JDK8需要使用JDK7 Update 7或更高版本的版本作为引导JDK,但不应使用JDK8作为引导JDK;命令行选项–with-debug-level=slowdebug,有这个选项,可以在GDB等代码调试过程中提供足够的信息;–enable-debug-symbols ZIP_DEBUGINFO_FILES=0生成调试的符号信息,并且不压缩。

在命令运行过程中,可能会提示运行如下的命令安装依赖包: 

sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

这个提示中,有个包的名称错误,我们需要将如上命令中libX11-dev包名改为libx11-dev。  

如果命令运行成功,会在当前目录下生成一个目录,目录的名称是根据要编译的目标确定的,如笔者Ubuntu 64位操作系统下生成的目录名为linux-x86_64-normal-server-slowdebug。

第二步,编译 

编译使用的命令如下:

make all ZIP_DEBUGINFO_FILES=0   DISABLE_HOTSPOT_OS_VERSION_CHECK=ok

如果命令运行成功,则成功编译出了JDK。运行如下命令:  

./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version

输出的信息如下:  

openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-mazhi_2019_08_12_20_52-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)

在openjdk下创建一个Test.java源文件,内容如下: 

public class Test{
     public static void main(String[] args){
        System.out.println("Hello World!");
     }
}

通过Javac编译器编译如上的源代码,得到Test.class文件。

运行如上的Class文件,命令如下:

./build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac Test.java
./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test

输出如下的信息:  

Hello World!

在编译的时候可能会出现如下2个问题:

(1)OS版本不支持

报错摘要如下:

/home/mazhi/workspace/openjdk8/hotspot/make/linux/Makefile:234: recipe for target 'check_os_version' failed

解决办法:

修改文件 ./hotspot/make/linux/Makefile
修改228行内容: SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 为 
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3% 4%

在执行make命令时最好也添加参数DISABLE_HOTSPOT_OS_VERSION_CHECK=ok。 

(2)参数不兼容

错误摘要如下:

recipe for target 'ad_stuff' failed

解决办法如下:

修改文件 ./hotspot/make/linux/makefiles/adjust-mflags.sh
删除第67行: s/-([^][^]*)j/-1-j/

搭建过程中如果有问题可直接评论留言或加作者微信mazhimazh。

作者持续维护的个人博客  classloading.com

关注公众号,有HotSpot源码剖析系列文章!

<span>在Ubuntu 16.04上编译OpenJDK8的源代码(配视频)</span>    

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2674.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」

    【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」Qt提供QThread类以进行多任务处理。与多任务处理一样,Qt提供的线程可以做到单个线程做不到的事情。例如,网络应用程序中,可以使用线程处理多种连接器。QThread继承自QObject类,且提供QMutex类以实现同步。线程和进程共享全局变量,可以使用互斥体对改变后的全局变量值实现同步。因此,必须编辑全局数据时,使用互斥体实现同步,其它进程则不能改变或浏览全局变量值。什么是互斥体?…

    2022年5月28日
    210
  • 什么是重载什么是覆盖_java覆盖和重载的关系

    什么是重载什么是覆盖_java覆盖和重载的关系java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限

    2022年8月2日
    6
  • 一文搞定7大流行后端框架:Spring、Netty、MyBatis、Hibernate、Dubbo…「建议收藏」

    一文搞定7大流行后端框架:Spring、Netty、MyBatis、Hibernate、Dubbo…「建议收藏」框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。今天给大家分享49篇【后端编程框架】相关精选学习资…

    2022年5月1日
    59
  • Qt播放器之自定义按钮

    Qt播放器之自定义按钮一、前言在做播放器时,Qt自带的按钮部件虽然很强大,但是显示效果还是不能令人满意。于是决定自定义一个简单的按钮部件。按钮部件只简单的显示按下、释放两个状态,并且只发出clicked()信号。基本功能如下:   当按下时显示一个按下的图标;   当释放时显示另一

    2022年6月11日
    28
  • LeetCode219:Contains Duplicate II

    LeetCode219:Contains Duplicate II

    2022年1月12日
    37
  • Full GC触发条件总结以及解决策略「建议收藏」

    前言FullGC相对于MinorGC来说,停止用户线程的STW(stoptheworld)时间过长,至少慢10倍以上,所以要尽量避免,首先说一下FullGC可能产生的原因,接着给出排查方法以及解决策略。FullGC产生原因下图为与产生FullGC相关的内存区域,初生代、老年代、以及Metaspace区域。System.gc()方法的调用在代码中调用System…

    2022年4月12日
    218

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号