1.下载OpenJDK源码
http://www.java.net/download/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip //我使用的JDK7
2.安装编译所需要的依赖
sudo apt-get install build-essential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-common libmotif-dev antsudo apt-get install libx11-devsudo apt-get install libxt-devsudo apt-get install libxext-devsudo apt-get install libxtst-dev
3.安装JDK
下载jdk1.6(http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html)赋予.bin的jdk安装包的执行权限,执行命令:chmod u+x jdk-6u25-linux-x64.bin 执行命令:sudo ./jdk-6u25-linux-x64.bin
4.配置环境变量
终端跳转到OpenJDK源码所在的目录,配置如下环境变量:
#!/bin/bash #设置语言 export LANG=C export ALT_BOOTDIR=/home/resound/jdk/jdk1.6.0_45#允许自动下载依赖包 export ALLOW_DOWNLOADS=true #手工下载的依赖包所在的目录:jaxp145_01.zip、jdk7-jaf-2010_08_19.zip、jdk7-jaxws2_2_4-b03-2011_05_27.zipexport ALT_DROPS_DIR=/home/resound/openjdk/drop#使用预编译头文件,不加这个编译会更慢 export USE_PRECOMPILED_HEADER=true#要编译的内容 export BUILD_LANGTOOLS=true export BUILD_JAXP=true export BUILD_JAXWS=true export BUILD_CORBA=true export BUILD_HOSTPOT=true export BUILD_JDK=true #要编译的版本 export SKIP_DEBUG_BUILD=false export SKIP_FASTDEBUG_BUILD=true export DEBUG_NAME=debug #把它设置为FALSE可以避免javaws和浏览器Java插件之类的部分build BUILD_DEPLOY=false#把它设置为false就不会build出安装包。因为安装包里有一些奇怪的依赖 #但即便不build出它也已经得到完整的JDK镜像,所以还是不用build它 BUILD_INSTALL=false #存放编译结果 export ALT_OUTPUTDIR=/home/resound/openjdk/buildunset CLASSPATH unset JAVA_HOME make 2>&1 | tee $ALT_OUTPUTDIR/build.log
5.编译OpenJDK源码
make sanity //检查编译,出现Sanity check passed 表示检查通过
make //正式编译 会出现一些错误,后续有我遇到的一些错误和解决方案
export JAVA_HOME=/home/resound/openjdk/build/j2sdk-imageexport JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=.:${JAVA_HOME}/bin:$PATH//配置JAVA_HOME指向编译结果,或将编译结果移动至JAVA_HOME
$ java -version//查看执行结果,编译出来的虚拟机,在-version命令中带有用户的机器名
6.遇到的问题
(1)ERROR: echo "*** This OS is not supported:" 'uname -a'; exit 1;
在我们下载的HotSpot源代码中,默认支持的Linux内核最高版本为2.6,而我们所用的发行版很有可能采用了高于此版本的Linux内核。例如,所用的Ubuntu的内核是3.5(可通过uname -r命令查看自己内核版本)。如果不进行一些调整的话,编译HotSpot时可能会遇到如下报错:
"*** This OS is not supported:" 'uname –a'; exit 1;```如果遇到这个问题,可以在这个文件中找到解决办法:hotspot/make/linux/Makefile。在Makefile文件中,定位到包含字符串“SUPPORTED_OS_VERSION”的代码,并在该行末尾增加“3.5%”,这样就可以使HotSpot支持我们实际使用的内核版本,调整后的代码如下:
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3.5%
另一种调整方法是绕过验证操作系统版本的步骤。如清单1-13所示的定位到包含字符串“check_os_version”的代码,将其删除或者注释掉便可。清单1-13来源:hotspot/make/linux/Makefile描述:验证OS版本
check_os_version:
ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)
$(QUIETLY) >&2 echo "* This OS is not supported:" 'uname -a'; exit 1;
endif`
`
(2)jaxp145_01.zip、jdk7-jaf-2010_08_19.zip、jdk7-jaxws2_2_4-b03-2011_05_27.zip依赖包下载地址变更
mkdir drop
cd drop
curl -L -O http://download.java.net/jaxp/1.4.5/jaxp145_01.zip
curl -L -O http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip
jaf地址:https://osdn.net/projects/sfnet_jdk7src/downloads/input-archives/jdk7-jaf-2010_08_19.zip/
将jar下载的包放到drop目录下
追加配置环境变量:export ALT_DROPS_DIR=/home/resound/openjdk/drop
(3)error: "__LEAF" redefined [-Werror]
cdefs.h中定义的宏“LEAF”与interfaceSupport.hpp冲突。可以在interfaceSupport.hpp中增加一个“#undef LEAF”语句来解决冲突,具体代码如清单1-14所示。
清单1-14
来源:hotspot/src/share/vm/runtime/interfaceSupport.hpp
描述:预定义宏__LEAF
// LEAF routines do not lock, GC or throw exceptions #ifdef __LEAF #undef __LEAF #define __LEAF(result_type, header) \ TRACE_CALL(result_type, header) \ debug_only(NoHandleMark __hm;) \ /* begin of body */ #endif
(4)error: converting 'false' to pointer type 'methodOop' [-Werror=conversion-null]
对应的文件的对应方法return false改成return NULL;
(6)Unable to load native library: /home/mengxiansen/program/java/jdk1.7.0_10/jre/lib/amd64/libjava.so: symbol JVM_SetNativeThreadName, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
出现以上问题,可以尝试使用使用Oracle的jdk6代替jdk7编译openjdk
(7)不识别'-mimpure-text'参数
错误信息:
gcc: error: unrecognized command line option '-mimpure-text'
make[5]: *** [/openjdk/build/linux-amd64/../linux-amd64-debug/lib/amd64/libverify.so] Error 1
解决办法:
gcc版本问题,这个命令在本机所用的4.7.2版的gcc中已经去除,既然不能降低gcc版本(本机ubuntu12.10内核用4.7.2版gcc编译),那
就在 【解压缩目录】/make/common/shared/Compiler-gcc.gmk 中去掉 -mimpure-text 命令
(8)出现Error: time is more than 10 years from present: 1104530400000,把以下文件中的所有时间修改成2010年
如果没有找到该文件,就全盘搜索
/jdk/src/share/classes/java/util/CurrencyData.properties
今年是2018年,把小于2008年的都改成2008年之后
(9)undefined reference to 'snd_pcm_*'
*** [/home/zlh/openjdk/build/linux-amd64/../linux-amd64-fastdebug/lib/amd64/libjsoundalsa.so] Error 1
jdk/make/javax/sound/jsoundalsa/Makefile文件的LDFLAGS += -lasound 改成 OTHER_LDLIBS += -lasound
并在后面追加:EXTRA_LIBS += -lasound
如果出现其他 "undefined reference to ..."错误可以临时注释掉部分代码