linux 编译openjdk失败记

  • 最近开始学习jvm虚拟机的知识,第一章就是自己编译一个openjdk,结果编译时遇到一个问题,尝试了好久都没能解决,心累的不想再试了。所以打算先继续往下学习,等以后如果有毅力再来试一试,另写下这篇博客谨记录自己编译openjdk失败了的过程和遇到的错误。

一、安装linux系统


  • 首先我是在windows平台上操作的,所以得先安装虚拟机软件VMware,安装教程百度。linux镜像我来选择的是ubuntu-14.04.5,安装教程百度。由于编译openjdk需要用到root的权限,建议先获取root权限(教程:https://blog.csdn.net/u014296316/article/details/82120341

二、下载编译源代码openjdk


三、配置编译环境


  • 编译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

//自己的安装路径
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,将里面日期改为距当前日期内的十年以内的日期。
有108439529555等行

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'
  • 补充:大概就记得有这些错误了,大部分都能百度得到解决,除了最后一个错误,如果有大神知道希望不吝赐教,本人万分感激

猜你喜欢

转载自blog.csdn.net/u014296316/article/details/82156179