Linux Mint 17.3 Rosa下JDK编译
通过《深入理解Java虚拟机:JVM高级特性与最佳实践(第三版)》的学习,觉得有很多细节需要注意,特此记录以备不时的参考之需…
Linux Mint 17.3 Rosa下Java虚拟机(HOTSPOT)源代码编译步骤
概述
1. hotspot源代码包含在openJDK7中
2. penJDK7包含了JDK的Java代码,所以要用JDK6对这部分代码进行编译(有点类似于gcc高版本代码要用gcc低版本编译一样)
3. 本次编译的JDK版本:openJDK7u40
4. 也可以用于 Ubuntu系操作系统
5. http://www.linuxidc.com/Linux/2016-04/130484.htm
准备
1. penJDK7源代码链接: http://pan.baidu.com/s/1hslDSXY 密码:js56,强烈建议初学者,用这个jdk源代码,按照下面的教程配置。其他源代码编译时,可能会出现各种问题
2. 工作环境:Linux Mint 17.3 Rosa
编译步骤
1. 安装依赖项:
sudo apt-get install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev X11proto-print-dev binutils libmotif3 libmotif-dev ant
2. 解压缩openJDK7源代码:
我把它放置在当前用户目录下面:/home/well/jdk/openjdk7u40/,如下图:
3. 编译前环境配置:
命令行中,cd 进入 openjdk7u40 源代码目录,切换成 root 用户:su root ,如下图:
再导入以下环境变量:
export LANG=C
exportALT\_BOOTDIR=/usr/lib/jvm/java-6-openjdk-i386
exportALT\_JDK\_IMPORT\_PATH=/usr/lib/jvm/java-6-openjdk-i386
export ALLOW\_DOWNLOADS=true
export HOST\_BUILD\_JOBS=4
export USE\_PRECOMPILED\_HEADER=true
export BUILD\_LANGTOOLS=true
export BUILD\_JAXP=true
export BUILD\_JAXWS=true
export BUILD\_CORBA=true
export BUILD\_HOTSPOT=true
export BUILD\_JDK=true
export BUILD\_INSTALL=false
exportALT\_OUTPUTDIR=/home/well/jdk/openjdk7u40/build
unset JAVA\_HOME
unset CLASSPATH
export WARNINGS\_ARE\_ERRORS=false
export SKIP\_DEBUG\_BUILD=false
export SKIP\_FASTDEBUG\_BUILD=true
export DEBUG\_NAME=debug
说明:以上环境变量命令直接复制到命令窗口执行即可,其中 exportALT\_BOOTDIR=/usr/lib/jvm/java-6-openjdk-i386 和exportALT\_JDK\_IMPORT\_PATH=/usr/lib/jvm/java-6-openjdk-i386两个是 openJDK6的路径,一般不需要修改(需要时可以指定其它的JDK作为启动器),装完openjdk-6-jdk一般就在这个路径上面,exportALT\_OUTPUTDIR=/home/well/jdk/openjdk7u40/build 这个是指定到自己需要编译的 openJDK7 对应路径
4. JDK编译前检查:
命令行执行make sanity,如下图:
按照上面环境变量配置后,make sanity一般不会出问题
5. JDK源码的编译:
命令行执行make DEBUG\_BINARIES=true,如下图:
一定要加上DEBUG\_BINARIES=true参数,以便在编译期间输出详细信息,经过半个多小时基本能编译完成
6. JDK源码编译后:
编译后的位置如下图:
build和build-debug目录里面的东西就是我们需要的咯
然后进入./build/j2sdk-image/目录(或者build-debug、build-fastdebug这两个目录),这是整个JDK的完整编译目录,复制到 JAVA\_HOME 目录,就可以作为一个完整的JDK使用,编译出来的虚拟机,在 java -version命令中带有用户名以及编译的日期时间等信息,如下图:
7. 后记
在大多数时候,如果我们并不关心JDK中HotSpot虚拟机以外的内容,只想单独编译HotSpot虚拟机的话(例如调试虚拟机时,每次改动程序都执行整个OpenJDK的MakeFile,编译速度肯定受不了),那么使用 ./hotspot/make 目录下的MakeFile进行替换即可,其他参数设置保持不变,这时候虚拟机的输出结果存放在./build/hotspot/outputdir/linux_i486_complier2/ 目录中(在不同的机器上面,最后那个目录的名称会有差别,linux表示Linux系统,i486表示32位JDK,complier2表示Server VM,complier1表示Client VM),进入后可以见到几个目录如下:
这些目录对应了不同的优化级别,级别越高,性能自然越好,但是输出代码与源代码的差距就越大,难于调试,具体使用那个目录的内容,取决于make命令后面的参数。
遇到的问题
1. 编译过程中出现./gamma: relocation error:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.36.x86_64/jre/lib/amd64/libjava.so:symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in filelibjvm.so with link time reference 异常,解决方案:
编辑./hotspot/make/linux/Makefile,注释掉所有的test\_gamma所在行
2. 编译过程中出现Error: time is more than 10 years from present: 1136059200000错误,解决方案:
修改CurrencyData.properties(路径:./jdk/src/share/classes/java/util/CurrencyData.properties)
修改108行:AZ=AZM;2011-12-31-20-00-00;AZN
修改381行:MZ=MZM;2011-06-30-22-00-00;MZN
修改443行:RO=ROL;2011-06-30-21-00-00;RON
修改535行:TR=TRL;2011-12-31-22-00-00;TRY
修改561行:VE=VEB;2011-01-01-04-00-00;VEF