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
    
    export ALT\_BOOTDIR=/usr/lib/jvm/java-6-openjdk-i386
    
    export ALT\_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
    
    export ALT\_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
    

    说明:以上环境变量命令直接复制到命令窗口执行即可,其中 export ALT\_BOOTDIR=/usr/lib/jvm/java-6-openjdk-i386 和 export ALT\_JDK\_IMPORT\_PATH=/usr/lib/jvm/java-6-openjdk-i386 两个是 openJDK6的路径,一般不需要修改(需要时可以指定其它的JDK作为启动器),装完openjdk-6-jdk一般就在这个路径上面, export ALT\_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 file libjvm.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;2009-06-30-21-00-00;RON
    
    修改535行:TR=TRL;2009-12-31-22-00-00;TRY
    
    修改561行:VE=VEB;2009-01-01-04-00-00;VEF
    
文章目录
,