《实战JAVA虚拟机》编译JDK源码(Ubuntu18.04)

折腾了好久,写下步骤吧。

初学者就乖乖跟着书本来了,所以先下载一个openJDK,openjdk-7u40-fcs-src-b43_aug_2013

然后书上建议用jdk1.6进行编译,这里选择不接受建议,用相同版本的jdk编译,Java SE Development Kit 7u40,结果出现了错误,所以还是改用Java SE Development Kit 6u45,和书上一样就比较安心了。但是又翻到这篇文章https://blog.csdn.net/hanghangde/article/details/54599750,书上的Ubuntu系统可能有些年代,所以还是听这篇文章的博主一句劝,先安装了jdk1.7.0_79来试试看(事实证明没有多大帮助,debug和fastdebug版本的jdk无法成功编译,会出现Error occurred during initialization of VM的错误,而且Ubuntu的版本又比较新,我又是个菜逼,没有找到解决方案)

上面有点乱,最终是这样的,openjdk的版本是openjdk-7u40-fcs-src-b43_aug_2013,Bootstrap jdk版本是jdk1.6.0_45

 

编译前的准备工作

和书上一样,sudo apt-get install把需要的依赖包安装好

修改gcc和g++版本

因为Ubuntu18.04的gcc,g++版本过高,会出现类似这样的问题:

invalid suffix on literal; C++11 requires a space between literal and identifier [-Wliteral-suffix]

所以把gcc和g++版本降低到4.8,流程可以参考这篇文章。我的做法如下

cd /usr/bin
sudo rm gcc
sudo rm g++
sudo apt-get install -y gcc-4.8
sudo apt-get install -y g++-4.8
sudo ln -s gcc-4.8 gcc
sudo ln -s g++-4.8 g++

 修改某个make文件

虽然修改了gcc和g++版本,编译过程还是出现

[-Wdeprecated-declarations]

导致无法继续,可以参考这篇文章。我的做法如下

1. 查看 解压后的文件目录/openjdk/hotspot/make/[you_os]/makefiles/gcc.make文件
2. 在该文件中找到 WARNINGS_ARE_ERRORS = -Werror,将其改为 WARNINGS_ARE_ERRORS = -Wno-all

下载1.9.14版本的ant

通过apt下载的ant版本似乎过高,所以下载好ant之后,手动配置环境

vim ~/.bashr
添加
#set apache ant environment
export ANT_HOME=/usr/lib/apache-ant-1.9.14
export PATH=${PATH}:${ANT_HOME}/bin

修改时间

错误,需要修改源码目录中的一个文件,这个文件是<OpenJDK源码目录>/jdk/src/share/classes/java/util/CurrencyData.properties。我们需要做的是把文件中以下的时间改为10年内的一个时间:

我全部都加了10年,修改的地方如下

AZ=AZM;2005-12-31-20-00-00;AZN
 
MZ=MZM;2006-06-30-22-00-00;MZN
 
RO=ROL;2005-06-30-21-00-00;RON
 
TR=TRL;2004-12-31-22-00-00;TRY
 
VE=VEB;2008-01-01-04-00-00;VEF


修改后如下:
AZ=AZM;2015-12-31-20-00-00;AZN

MZ=MZM;2016-06-30-22-00-00;MZN

RO=ROL;2015-06-30-21-00-00;RON

TR=TRL;2014-12-31-22-00-00;TRY

VE=VEB;2018-01-01-04-00-00;VEF

开始编译(正常步骤)

(1)编写build.sh文件

#!/bin/bash

#语言选项,必须设置
export LANG=C

#export ANT_HOME=/usr/lib/apache-ant-1.9.14

#Bootstrap JDK的安装路径,必须设置
export ALT_BOOTDIR=/usr/lib/jdk1.6.0_45
export ALT_JDK_IMPORT_PATH=/usr/lib/jdk1.6.0_45

#允许自动下载
export ALLOW_DOWNLOADS=true

#并行编译的线程数
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4

#比较本次build出来的映像与之前版本的差异,可以关掉
export SKIP_COMPARE_IMAGE=false

#使用预编译头文件,不加可能编译会变慢
export USE_PRECOMPILED_HEADER=true

#要编译的内容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
export BUILD_JAXWS=false
export BUILD_JAXP=false
export BUILD_CORBA=true

#要编译的版本
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=false
export DEBUG_NAME=debug

#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build
BUILD_DEPLOY=false

#把它设置为flase就不会build出安装包
BUILD_INSTALL=false

#编译结果存放的路径
export ALT_OUTPUTDIR=/opt/openjdk-7u40-fcs-src-b43-26_aug_2013/openjdk/build

#这两个环境变量必须去掉
unset JAVA_HOME
unset CLASSPATH

cd /opt/openjdk-7u40-fcs-src-b43-26_aug_2013/openjdk
make LANG=C ALT_BOOTDIR=/usr/lib/jdk1.6.0_45 ALT_JDK_IMPORT_PATH=/usr/lib/jdk1.6.0_45 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ANT_HOME=/usr/lib/apache-ant-1.9.14 PATH=$ANT_HOME/bin:$PATH ALT_OUTPUTDIR=/opt/openjdk-7u40-fcs-src-b43-26_aug_2013/openjdk/build 

(2)执行

首先就是
chmod +x build.sh

然后检查一下,检查中没有warning就可以,如果有error说是已经设置了JAVA_HOME或者CLASSPATH的,先在配置文件中注释掉就行(/etc/profile或者~/.bashrc)
make sanity

最后是执行
./build.sh

但是这么做有个问题,fastdebug版本编译一直出现以下错误:

Error occurred during initialization of VM
java/lang/ClassNotFoundException: error in opening JAR file <Zip file open error>

而且网上没找到解决办法,文档里面也没有,而且也没有出现书上说的编译出三个版本,所以尝试了一下另外的方法。

开始编译(瞎搞的步骤)

分别编译

1. 编译常规发行版本

make LANG=C ALT_BOOTDIR=/usr/lib/jdk1.6.0_45 ALT_JDK_IMPORT_PATH=/usr/lib/jdk1.6.0_45 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ANT_HOME=/usr/lib/apache-ant-1.9.14 PATH=$ANT_HOME/bin:$PATH SKIP_DEBUG_BUILD=true SKIT_FASTDEBUG_BUILD=true

2.编译debug版本

make LANG=C ALT_BOOTDIR=/usr/lib/jdk1.6.0_45 ALT_JDK_IMPORT_PATH=/usr/lib/jdk1.6.0_45 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ANT_HOME=/usr/lib/apache-ant-1.9.14 PATH=$ANT_HOME/bin:$PATH SKIP_DEBUG_BUILD=false SKIT_FASTDEBUG_BUILD=false DEBUG_NAME=debug

 3.编译fastdebug版本

make LANG=C ALT_BOOTDIR=/usr/lib/jdk1.6.0_45 ALT_JDK_IMPORT_PATH=/usr/lib/jdk1.6.0_45 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ANT_HOME=/usr/lib/apache-ant-1.9.14 PATH=$ANT_HOME/bin:$PATH SKIT_FASTDEBUG_BUILD=false

然后debug版本和fastdebug版本都会有这个问题:

Error occurred during initialization of VM

仍然没有好的解决方案,不过原因似乎是

 

错误

javac: invalid source release: 7
Usage: javac <options> <source files>
use -help for a list of possible options

参考文章

https://blog.csdn.net/hanghangde/article/details/54599750

https://blog.csdn.net/qq_33160790/article/details/80464473

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值