一、笔者环境
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的版本,就可以编译通过了
- 下载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文件中有,就不用添加了,没有添加上就行
解决完错误,再执行编译命令,就可以编译成功了,成功后打印日志如下:
本人微信公众号: