Ubuntu下编译openjdk8

一、笔者环境

1.Ubuntu18.04

2.openjdk8u60

二、源码下载

由于openjdk使用mercurial版本管理工具构建的, 所以可以使用mercurial来下载源码,但是下载速度不敢恭维,我是在openjdk官网:http://hg.openjdk.java.net/jdk8u下载的openjdk8u60版本,我已上传到github,这里给出我的github地址:https://github.com/wildwolf0/opjdk8u60,可以到github直接拉取我下载好的源码。

下面给出使用mercurial下载源码的步骤,网速好的话,大家可以尝试下使用mercurial下载源码。

1.安装mercurial

sudo apt install mercurial

2.建立目标目录,如/opt/jdk/jdk8u60

3.下载源码,下载的是顶层目录的源码

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u60 /opt/jdk/jdk8u60

4.获取完整源码,也就是各个子项目的源码,比如Hotspot,jdk等等

cd /opt/jdk/jdk8u60/
sh get_source.sh

三、编译源码,可以单独编译各个独立的子项目,比如单独编译jdk,Hotspot等等,我这里编译整个项目。

1.安装引导jdk,openjdk的源码编译是需要引导jdk的,引导jdk需要比要编译的openjdk低一个版本,比如我们要编译openjdk8,就需要jdk7来做引导jdk,可以是openjdk7,也可以是oraclejdk7.那么为什么需要引导jdk呢?我们知道jdk版本都是在前一个版本的基础上开发出来的,我们要编译的openjdk8在开发的时候,是需要用jdk7做环境的,在jdk7上做开发测试,是在jdk7的基础上开发出来的。

我装的引导jdk是oraclejdk7,至于jdk的安装这里就不在赘述了

安装完后配置环境变量(这步不配置也行,我每次都配置):

sudo vim /etc/profile

export JAVA_HOME=/opt/jdk/jdk7 //改成自己的jdk的目录
export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = JAVA_HOME/jre export CLASSPATH= JAVAHOME/jreexportCLASSPATH=JAVA_HOME/lib: J R E H O M E / l i b : JRE_HOME/lib: JREHOME/lib:CLASSPATH
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:JRE_HOME/bin:$PATH

source /etc/profile

2.配置编译环境,这步需要先安装编译需要的工具包,有可能每个人的环境中缺少的工具包不一样,大家可以先执行编译环境配置命令:
bash ./configure --with-target-bits=64 --with-boot-jdk=/opt/jdk/jdk7/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
然后根据错误提示一步一步地安装缺少的工具包,直到配置成功。

这里列出我安装的工具包:
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
sudo apt-get install ccache

如果是按照错误指引安装工具包,有一步是提示缺少libX11-dev,而当我们sudo apt-get install libX11-dev时,却报错:

无法定位软件包 libX11-dev

我们需要把libX11-dev中的大写X改成小写x

安装完工具包,就可以配置编译环境了:

bash ./configure --with-target-bits=64 --with-boot-jdk=/opt/jdk/jdk7/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0

上面configure用到的参数作用说明如下:

–with-target-bits=64 -->指定编译生成64位的jdk
–with-boot-jdk=/opt/jdk/jdk7/ -->引导jdk的路径
–with-debug-level=slowdebug --> 编译时debug的级别,有release, fastdebug, slowdebug 三种级别

说下fastdebug,设置了 fastdebug 参数,那么编译后的目录就会有这个版本 jdk,fastdebug是由于 jdk 的开发人员无法忍受编译器缓慢的调试速度而打造的新调试版本,它的调试速度会比普通的 debug 快,相应的也有slowdebug。

–enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --> 生成调试的符号信息,并且不压缩

配置成功后如下图:
在这里插入图片描述
3.执行编译命令,这一步可能会报错,需要解决错误。

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

make all ZIP_DEBUGINFO_FILES=0

4.问题解决:

错误1:
/opt/jdk/jdk8u60/hotspot/src/os/linux/vm/os_linux.inline.hpp:127:42: error: ‘int readdir_r(DIR*, dirent*, dirent**)’ is deprecated [-Werror=deprecated-declarations]

报这个错误应该算是openjdk的一个bug吧,原因是由于glibc >= 2.24的情况下,方法 readdir_r被 deprecated,不支持了,通过getconf GNU_LIBC_VERSION检查发现Ubuntu 18.04.1 LTS版本为glibc 2.27

解决方法如下:

在./hotspot/make/linux/makefiles/gcc.make文件中找到WARNINGS_ARE_ERRORS = -Werro,注释该段或改成WARNINGS_ARE_ERRORS = -Wno-all。

错误2:
left operand of shift expression ‘(-1 << 28)’ is negative [-fpermissive]
invalid suffix on literal; C++11 requires a space between literal and string

报这个错误是由于ubuntu18.x或是ubuntu19.x的gcc和g++版本太高了,导致编译通不过,所以需要将ubuntu中的gcc和g++版本降低。

解决方法如下:

先查看自己ubuntu中的gcc版本 gcc --version
我是把gcc和g++降到gcc/g++5的版本,就可以编译通过了

  1. 下载gcc/g++ 5

sudo apt-get install -y gcc-5
sudo apt-get install -y g+±52. 链接gcc/g++实现降级

cd /usr/bin
sudo rm gcc
sudo ln -s gcc-5 gcc
sudo rm g++
sudo ln -s g+±5 g++
再次查看gcc版本,可以看到已经降级.

gcc --version
如果遇到: “this OS is not supported:” ‘uname -a’;exit 1; 这个错误就是内核版本不支持的问题(openjdk8我还没遇到这个错误),在编译Hotspot时通不过

解决:找到hotspot/make/linux/Makefile,在Makefile文件中定位到SUPPORTED_OS_VERSION的代码,在末尾添加自己ubuntu当前的内核版本。

SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%

ubuntu18.04的内核版本是4.x%的,大家查看下自己的内核版本是多少,如果Makefile文件中有,就不用添加了,没有添加上就行

解决完错误,再执行编译命令,就可以编译成功了,成功后打印日志如下:
在这里插入图片描述

本人微信公众号:
点点关注,点关注,不迷路

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值