Ubuntu 18.04.1下源码编译安装OpenJDK8

自己编译个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
cd jdk8u-dev
sh get_source.sh

第二种就是手动方式,说白了就是自己去下载源码包,然后解压,优点就是耗时短,但相对来说如果不会查找资源,就只能下载到老版本的源代码,比如我就只找到这个链接下的源代码,这个版本是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,结果如下:

linuxidc@linuxidc:~$ 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来检查编译环境的依赖项是否全部安装完成。直到看到这个结果:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12474.html