- 最近开始学习jvm虚拟机的知识,第一章就是自己编译一个openjdk,结果编译时遇到一个问题,尝试了好久都没能解决,心累的不想再试了。所以打算先继续往下学习,等以后如果有毅力再来试一试,另写下这篇博客谨记录自己编译openjdk失败了的过程和遇到的错误。
一、安装linux系统
- 首先我是在windows平台上操作的,所以得先安装虚拟机软件VMware,安装教程百度。linux镜像我来选择的是ubuntu-14.04.5,安装教程百度。由于编译openjdk需要用到root的权限,建议先获取root权限(教程:https://blog.csdn.net/u014296316/article/details/82120341)
二、下载编译源代码openjdk
- 这里我们选择的是openjdk7
- 下载地址:https://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip
- 放置到linux上并解压
三、配置编译环境
- 编译openjdk你需c++的编译环境和jdk的编译环境,至于为什么需要安装以下软件我完全一脸懵逼,对c++的环境也完全不理解,也以至于遇到的那个问题查出是什么问题也也解决不了。废话不多说,安装如下:
- 首先打开终端(Crtl+Alt+T),以root账户进行操作
1.安装gcc、g++、make等
sudo apt-get install build-essential
2.安装XRender
sudo apt-get install libxrender-dev
sudo apt-get install xorg-dev
3.安装alsa
sudo apt-get install libasound2-dev (daozhe)
4.Cups
sudo apt-get install libcups2-dev
5.安装零碎的工具包
sudo apt-get install gawk zip libxtst-dev libxi-dev libxt-dev
6.关于安装ant与jdk
- 由于第一次不懂,ant与jdk我是自己下载安装包进行安装的,安装方式很简单,把安装包下载下来,解压到安装目录即可
- 我使用的ant的下载地址:http://mirrors.shu.edu.cn/apache//ant/binaries/apache-ant-1.9.13-bin.tar.gz
- 关于jdk,一开始我是使用jdk1.7的版本,后来编译时不通过,发现只能使用jdk1.6的版本我选择的是6u45,下载时还有oracle账户,百度一下即有提供者,地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u21-oth-JPR
- 配置环境变量,在/etc/profile文件末尾添加如下配置(配置环境变量方式)
//自己的安装路径
export JAVA_HOME=/opt/jdk1.6.0_45
// 在文件最后添加ant环境
export ANT_HOME=/opt/ant
// 并把jdk,ant环境添加到path中
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
- 也可以如上自动安装ant和jdk
sudo apt-get install openjdk-6-jdk
sudo apt-get install ant
四、编写测试脚本
- 这是我那不成气候,看不明白,东拼西凑的shell脚本,如果看出什么错误希望不吝赐教
- 脚本文件以.sh格式结尾,然后在终端,选择到该文件所在的目录,以./xxx.sh方式执行该脚本
#!/bin/bash
#export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_45
#export -n JAVA_HOME
#export ALT_JDK_IMPORT_PATH=/opt/openjdk
#export ALT_OUTPUTDIR=/home/ubnutu64/Downloads/test
#make sanity BUILD_JAXWS=false BUILD_JAXP=false
cd /opt/openjdk
# export ALT_BOOTDIR
export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_45
# set build profile,first 'chmod +x jdk_generic_profile.sh'
jdk/make/jdk_generic_profile.sh
# disable JAVA_HOME
export -n JAVA_HOME
# export ALT_JDK_IMPORT_PATH
export ALT_JDK_IMPORT_PATH=/opt/openjdk
export ALT_DROPS_DIR=/opt/openjdk/drop
# start build
export ALLOW_DOWNLOADS=true
#把它设置为FALSE可以避免javaws和浏览器Java插件之类的部分build
BUILD_DEPLOY=false
#把它设置为false就不会build出安装包。因为安装包里有一些奇怪的依赖
#但即便不build出它也已经得到完整的JDK镜像,所以还是不用build它
BUILD_INSTALL=false
#存放编译结果
export ALT_OUTPUTDIR=/opt/openjdk/build
make DEBUG_NAME=all_fastdebug
#make DEBUG_NAME=all_fastdebug BUILD_JAXWS=false BUILD_JAXP=false
五、编译遇到的问题及解决方式
1./usr/local/openjdk7-debug/jaxws/build/xml_generated/build-drop-jaf_src.xml:96: Redirection detected from https to http. Protocol switch unsafe, not allowed.
- 原因:是jdk7-jaf-2010_08_19.zip这个包下载不了导致的
- 解决方案
将以下三个文件下载后置于OpenJDK解压后根目录下的drop目录下,
并在环境变量中加入配置:export ALT_DROPS_DIR=/usr/local/src/openjdk7/drop # 注意目录Path
jdk7-jaf-2010_08_19.zip,下载地址:https://netix.dl.sourceforge.net/project/jdk7src/input-archives/jdk7-jaf-2010_08_19.zip
jdk7-jaxws2_2_4-b03-2011_05_27.zip,下载地址:http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip
jaxp145_01.zip,下载地址:http://download.java.net/jaxp/1.4.5/jaxp145_01.zip
2.java.lang.RuntimeException: time is more than 10 years from present
- 原因:openjdk的部分设定时间超时
- 解决方案:
修改(openjdk下的目录)jdk/src/share/classes/java/util/CurrencyData.properties,将里面日期改为距当前日期内的十年以内的日期。
有108、439、529、555等行
3./opt/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp:430:0: error: “__LEAF” redefined [-Werror]
- 问题:在linux的头文件cdefs.h里,有个__LEAF的宏,这个和hotspot/src/share/vm/runtime/interfaceSupport.hpp这个头文件中的宏定义有冲突
- 解决方案:
在interfaceSupport.hpp文件例增加一个#undef __LEAF 的定义
4./openjdk/hotspot/src/share/vm/oops/constantPoolOop.cpp:272:39: error: converting ‘false’ to pointer type ‘methodOop’ [-Werror=conversion-null]
- 问题:返回值类型问题
- 解决方案:
有两个解决方法,一个是加上强转类型,另一个是返回NULL
1 return (methodOop)false;
2 return NULL;
5.openjdk/hotspot/src/share/vm/opto/loopnode.cpp:896:50: error: converting ‘false’ to pointer type ‘Node*’ [-Werror=conversion-null]
* 原因:同第四点一样
* 解决方案:
loopnode.cpp文件内找到该句
if (cpool->cache() == NULL) return false; // nothing to load yet
并改为
if (cpool->cache() == NULL) return NULL;
6.未解决错误
- 最后就卡在这里,查不到解决方案
/opt/openjdk/build/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_Ports.o: In function `setRealVolume':
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe2b): undefined reference to `snd_mixer_selem_get_playback_volume_range'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe66): undefined reference to `snd_mixer_selem_set_playback_volume'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xe79): undefined reference to `snd_mixer_selem_get_capture_volume_range'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xeb0): undefined reference to `snd_mixer_selem_set_capture_volume'
/opt/openjdk/build/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_Ports.o: In function `PORT_SetIntValue':
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xc3b): undefined reference to `snd_mixer_selem_set_capture_switch_all'
PLATFORM_API_LinuxOS_ALSA_Ports.c:(.text+0xc4a): undefined reference to `snd_mixer_selem_set_playback_switch_all'
collect2: error: ld returned 1 exit status
make[5]: *** [/opt/openjdk/build/lib/amd64/libjsoundalsa.so] Error 1
make[5]: Leaving directory `/opt/openjdk/jdk/make/javax/sound/jsoundalsa'
make[4]: *** [build] Error 1
make[4]: Leaving directory `/opt/openjdk/jdk/make/javax/sound'
make[3]: *** [all] Error 1
make[3]: Leaving directory `/opt/openjdk/jdk/make/javax'
- 补充:大概就记得有这些错误了,大部分都能百度得到解决,除了最后一个错误,如果有大神知道希望不吝赐教,本人万分感激