JVM-Ubuntu18.04.1下编译OpenJDK8

近期开始学习JVM,看的是周老师的《深入理解Java虚拟机》,打算先自己编译个JDK来提升对JVM的兴趣。本文分三部分来描述编译OpenJDK的过程,分别是编译前准备工作构建编译环境进行编译,在这三部分内容中顺带把趟的坑一起说明下。

、编译前准备工作

1.1 安装Linux环境

  编译OpenJDK,Windows环境要比Linux环境复杂,故选择安装Linux环境。可以自己在Windows下安装虚拟机,也可以直接安装双系统,专门空出一个磁盘来安装Linux,我选择了后者,安装最新版的Ubuntu 18.04.1 LTS,搭建双系统的过程这里不再赘述,网络上有非常多的材料可以参考。我的电脑是ThinkPad-E480,安装完成后巨坑,无法连接WIFI,害得我花了一个晚上来解决这个问题,附上解决问题链接:

https://askubuntu.com/questions/1070593/lenovo-thinkpad-e480-no-wifi-adaptor-found-in-ubuntu-18-04

1.2 下载OpenJDK源码

  原本是计划按照周老师的书一步一步的操作,所以计划的是编译OpenJDK7,OpenJDK7对应的BootStrapJDK是OpenJDK6,无奈OpenJDK6在Ubuntu 18.04.1 LTS上很难再找到资源,故放弃了这个思路,改成编译OpenJDK8,BootStrapJDK是OpenJDK7,实践证明这个操作也是一路的坑,后面环节再叙述。

  确定了思路后,接下来就是下载OpenJDK8的源代码,有两种方式:

  第一种就是Mercurial,优点就是操作起来很简单,不需要再解压文件包,缺点就是需要耗费的时间长一些,实际上本人最终就是使用的这种方式,预计耗时半小时左右。Mercurial也是一种版本管理工具,大家可以想象下SVN、Git之类的工具。下载代码的命令如下:

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev
cd jdk8u-dev
sh get_source.sh

  第二种就是手动方式,说白了就是自己去下载源码包,然后解压,优点就是耗时短,但相对来说如果不会查找资源,就只能下载到老版本的源代码,比如我就只找到这个链接http://jdk.java.net/java-se-ri/8下的源代码,这个版本是2015年的版本,距离现在已经过去了三年,这样的代码其实在后面的编译过程中如果遇到一些问题就无法判断是Linux的问题还是OpenJDK8的代码问题。

  到目前为止,已经有了Linux操作系统,需要编译的OpenJDK源代码也已经有了,下一个环节便是思考如何构建编译环境。

二、构建编译环境

  学习了这么多年,大家应该都具备了一定的学习方法。做IT的一个很重要的学习方法就是在拿到资料后,最好先翻阅下这个资料的DEMO或者是README之类的。同样,OpenJDK源代码目录下也有这样一个文件,叫做README-builds.html。

  这个文件基本上贯穿了咱们本文的操作流程,首先来看下Introduction:

  • The
    build is now a "configure &&
    make
    " style build
  • Any
    GNU make 3.81 or newer should work
  • The
    build should scale, i.e. more processors should cause the build to
    be done in less wall-clock time
  • Nested
    or recursive make invocations have been significantly reduced, as
    has the total fork/exec or spawning of sub processes during the
    build
  • Windows
    MKS usage is no longer supported
  • Windows
    Visual Studio vsvars*.bat and
    vcvars*.bat files are run automatically
  • Ant
    is no longer used when building the OpenJDK
  • Use
    of ALT_* environment variables for configuring the build is no
    longer supported

  和OpenJDK7的构建相比,已经不再需要Ant,另外ALT_*
的环境变量也不再支持,OpenJDK7的编译过程可查看周老师的书,也可以网上查阅其他资料。

  文件的第二部分内容是下载源代码,目前代码下载环节已在本文1.2中体现,这里不再赘述。

  第三部分就是Building,这里声明了各个操作系统环境中的软件硬件要求,明确要求了OpenJDK8的boot
JDK
JDK
7

2.1
安装boot
JDK

  在文件中的Specific
Developer Build Environments
部分实际也约定了如何安装boot
JDK
,命令如下(在Ubuntu
18.04.1 LTS
aptitude
应该改成apt-get):

sudo aptitude build-dep openjdk-7
sudo aptitude install openjdk-7-jdk 

  实际执行下来,如上命令也是不成功的,提示没有可安装候选,这个也就是本文1.2提到的其中一个坑,该如何解决呢?请看https://askubuntu.com/questions/761127/how-do-i-install-openjdk-7-on-ubuntu-16-04-or-higher,里面的ppa方式也已经过期了,只能按MDMower描述的方案来操作,我这边选择了Manual Installation,最终成功安装boot JDK,结果如下:

[email protected]:~$ java -version
java version "1.7.0_161"
OpenJDK Runtime Environment (IcedTea 2.6.12) (7u161-2.6.12-1)
OpenJDK 64-Bit Server VM (build 24.161-b01, mixed mode)

2.2 依赖检查

  实际上如果是按照README-builds.html的流程,在安装boot JDK之前是先进行依赖检查的,即使没有先安装boot JDK,直接通过bash ./configure来检查的话,这步最先提示的也是安装boot JDK,提示如下:

configure: Could not find a valid Boot JDK. You might be able to fix this by running ‘sudo apt-get install openjdk-7-jdk‘.
configure: This might be fixed by explicitely setting –with-boot-jdk

  在完成本文2.1后,接下来就是递归执行bash ./configure来检查编译环境的依赖项是否全部安装完成。直到看到这个结果:

====================================================
A new configuration has been successfully created in
/home/lingjiango/jdk8u-dev/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_161" OpenJDK Runtime Environment (IcedTea 2.6.12) (7u161-2.6.12-1) OpenJDK 64-Bit Server VM (build 24.161-b01, mixed mode)  (at /usr/lib/jvm/java-7-openjdk-amd64)
* Toolchain:      gcc (GNU Compiler Collection)
* C Compiler:     Version 7.3.0 (at /usr/bin/gcc)
* C++ Compiler:   Version 7.3.0 (at /usr/bin/g++)

Build performance summary:
* Cores to use:   7
* Memory limit:   7872 MB

  这里再补充说明下,在递归执行依赖检查的过程中可能会提示这个 libx11-devUbuntu 18.04.1 LTS是这么提示安装项目的:

sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
  libX11-devX是大写的,应该会提示找不到这个依赖项,这个时候要把大写X改成小写的x,为 libx11-dev,就可以找到依赖项了。  到这一步,OpenJDK8的编译环境就已经准备好了,下一步就是编译OpenJDK8

三、进行编译

  编译的代码很简单,直接make
all即可,当然也可以按照README-builds.html中对make执行带参数编译,说明如下:


Make
Target


Description


empty


build
everything but no images


all


build
everything including images


all-conf


build
all configurations


images


create
complete j2sdk and j2re images


install


install
the generated images locally, typically in /usr/local


clean


remove
all files generated by make, but not those generated by configure


dist-clean


remove
all files generated by both and configure
(basically killing the configuration)


help


give
some help on using make, including
some interesting make targets

  在编译前还有几个注意事项,这些注意事项在文件README-builds.html中也是有体现的:

  设定语言选项,可先执行echo $LANG,看下输出,如果不是C,则执行export LANG=C;

  设定PATH,可先执行echo $PATH,看下输出,如果没有boot JDK,则执行export PATH="/usr/lib/jvm/java-7-openjdk-amd64/bin:${PATH}"

  检查JAVA_HOME ,可先执行echo $JAVA_HOME,看下输出,如果有值则需要unset JAVA_HOME

  这三步检查执行通过后,就可以执行make命令了。一切顺利的话,就可以看到这样的编译结果:

## Finished docs (build time 00:01:46)

----- Build times -------
Start 2018-09-23 16:59:30
End   2018-09-23 17:08:39
00:00:19 corba
00:00:13 demos
00:01:46 docs
00:03:26 hotspot
00:00:18 images
00:00:13 jaxp
00:00:17 jaxws
00:02:01 jdk
00:00:25 langtools
00:00:11 nashorn
00:09:09 TOTAL
-------------------------
Finished building OpenJDK for target ‘all‘

  看到这样的结果,表示编译成功,可以到多个目录下的bin目录执行./java -version来验证。

[email protected]:~/jdk8u-dev/build/linux-x86_64-normal-server-release/jdk/bin$ ./java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-lingjiango_2018_09_23_16_59-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)

[email protected]-ThinkPad-E480:~/jdk8u-dev/build/linux-x86_64-normal-server-release/images/j2sdk-image/bin$ ./java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-lingjiango_2018_09_23_16_59-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)

  事实上,我在编译的过程中就不顺利,主要遇到了两个问题:

1、编译内核版本问题

  在本文1.2中已经提到了两种获取源码的方式,其实一开始我采用的是方法二,下载的是2015年的openjdk-8u40,这个源码包中的/hotspot/make/linux/Makefile文件中声明的SUPPORTED_OS_VERSION不支持4.X的内核,所以编译报如下截图的错误:

  因为Ubuntu 18.04.1 LTS的内核是4.15.0-34-generic,故如果要继续编译下去,需要将MakefileSUPPORTED_OS_VERSION那行后面添加4%

2、-Werror=deprecated-declarations问题

  在我把问题1解决后,继续编译,后面又碰到了很多神奇的问题,而且很难查找到相关解决问题的资料。所以我只能从逻辑上推理下,OpenJDK8一直在更新发展,Ubuntu 也一直在更新发展,两者同步更新,应该取最新的文件编译起来问题才会少一些,而且猜测也有更多的资料可查,但是现在用的是2015年的openjdk-8u40,而 Ubuntu又是最新的,所以有问题估计也没有人去修复(其实我们的很多应用系统一样也是这个道理,年久失修,没什么人用的功能有问题也不一定去修复)。这个时候我果断切换到最新的OpenJDK8,通过Mercurial下载最新的代码,然后在Ubuntu 18.04.1 LTS编译。编译的过程就碰到一个问题,报错如下:

os_linux.inline.hpp:127:18: error: ‘int readdir_r(DIR*, dirent*, dirent**)‘ is deprecated [-Werror=deprecated-declarations]

  查阅网上资料说是这是因为glibc >= 2.24的情况下,方法 readdir_rdeprecated,不支持了,通过getconf GNU_LIBC_VERSION检查发现Ubuntu 18.04.1 LTS版本为glibc 2.27,而且也有很多人在OpenJDK上报了BUG,链接https://bugs.openjdk.java.net/browse/JDK-8179887,不过看起来6/7/8/9都不打算修复此问题,会在11修复这个BUG,所以当前只能通过其他的方式来解决,解决方案如下:

在./hotspot/make/linux/makefiles/gcc.make文件中找到WARNINGS_ARE_ERRORS = -Werro,注释该段或改成WARNINGS_ARE_ERRORS = -Wno-all。再编译就会忽略掉警告,直到编译完成。

参考资料:

《深入理解Java虚拟机》

README-builds.html

原文地址:https://www.cnblogs.com/iou123lg/p/9696039.html

时间: 2024-08-03 05:07:09

JVM-Ubuntu18.04.1下编译OpenJDK8的相关文章

在ubuntu 12.04 x64下编译hadoop2.4

自己编译hadoop:x64 1.安装依赖包 sudo apt-get install g++ autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev openssh-server maven openssh-client 2.下载hadoop源码 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.4.0/hadoop-2.4.0-src.tar.g

Centos7 下编译 Openjdk8

本文主要介绍如何在 Centos7 下编译 Openjdk8 源码,<深入理解java虚拟机>第二版网上好多 openjdk7 的帖子,编译 jdk8 和 7 还是有些差别的,比如大家经常提到的 make sanity 在 jdk8 源码里是没有的,下面我们一步步编译 openjdk8. 1 安装Bootstrap JDK 这里完全按照官方的说明来的. 1 yum install java-1.8.0-openjdk 然后 java -version 看下已安装的 jdk 版本,确实是 1.8

Ubuntu18.04/Linux下安装DosBox进行8086汇编

在windowsXP等32位系统会自带有debug等汇编调试工具,但是到之后的win7等64位系统之后移除了这个功能,其他系统诸如linux,Mac OS等等则没有,学习汇编,需要用到一些工具及软件,其中dosbox则是一个很好的选择,这里只介绍在汇编中如何使用dosbox.1.系统:ubuntu18.04 一.DOSBox简介 1.DOSBox 是一款模拟的 X86 机器,集成了 DOS 系统,可以运行旧的 DOS 游戏.这个模拟机允许你控制老游戏的速度,以及模拟旧的硬件,比如声卡和显卡,不管

JAVA虚拟机学习笔记(一)Windows10下编译OpenJDK8

转载请注明源地址:http://www.cnblogs.com/lighten/p/5906359.html 1. 编译环境的准备 1.1 JDK源码下载 OpenJDK是JAVA发展史中的一个开源项目,本文以OpenJDK8为例进行编译.OpenJDK的官网为:http://openjdk.java.net/,直接访问http://openjdk.java.net/install/index.html进入主要界面.左侧有一系列的,找到Source code列表,其提供了两种形式的下载:Merc

Windows 10 下编译 OpenJDK8

只是编译,不调试. 一.安装 Cygwin 32 位和 64 位都可以试试. https://cygwin.com/install.html 把这些装上(https://hg.openjdk.java.net/jdk8u/jdk8u/raw-file/tip/README-builds.html) 二.下载源码(OpenJDK8) https://www.mercurial-scm.org/downloads # 下载源码,目标目录需要为空 hg clone http://hg.openjdk.

Ubuntu18.04.2下安装 RTX2080 Nvidia显卡驱动

不久前入手了蓝天P870TM1G准系统,配置如下: 1. Z370主板 2. i9-9900k桌面处理器 3. RTX2080移动版 由于显卡太新的缘故,安装Ubuntu16.04时,试了好多版本,只有16.04.6能顺利安装,可是继续安装Nvidia显卡驱动时各种失败,最后重装了18.04.2版本.接着尝试安装显卡驱动. 通常情况下在使用命令 sudo apt-get update, sudo apt-get upgrade 后,就可以在 Software & Updates 里面的Addit

在ubuntu14.04环境下编译gcc

到GNU开源网址下载gcc源码,并查看编译教程 GNU/GCC网址:http://www.gnu.org/software/gcc/ 2.根据官网教程,编译gcc的所需环境依赖m4,gmp,mfpr,mpc GNU Multiple Precision Library (GMP) version 4.3.2 (or later) Necessary to build GCC.  If a GMP source distribution is found in a subdirectory of

解决ubuntu18.04系统下网易云音乐安装后无法打开问题

第一步:在终端修改sudoers sudo gedit /etc/sudoer # 在打开的文本编辑器中,最后添加一行(felix为我的用户名) felix ALL = NOPASSWD:  /usr/bin/netease-cloud-music # 保存退出 第二步:修改网易云音乐的启动图标 sudo gedit /usr/share/applications/netease-cloud-music.desktop # 修改Exec这一行 Exec = sudo netease-cloud-

ubuntu18.04.2LTS下安装和配置MySql数据库 --Linux

1.安装MySql ubuntu@thanlon-ubuntu:~$ sudo apt install mysql-server 2.mysql安装完成后,默认用户名不是root,为了方便,一般我们需要修改成我们想要的用户名子和对应的密码. 进入配置文件:root@thanlon-Ubuntu:/etc/mysql# vi /etc/mysql/debian.cnf debian.cnf: # Automatically generated for Debian scripts. DO NOT