编译openjdk详解

  前言:

       一直想看看jvm的庐山真面目。就自己编译了一遍openjdk,期间遇到很多错误,参考了很多篇博文,一把辛酸泪。我几乎把jdk6以上的jdk都下了一遍。用jdk6编jdk7,jdk7编jdk8..........无奈都失败了。主要是刚开始,对Makefile编译不熟,遇到bug就乱了阵脚。经过几次失败后,又学了一些相关编译方面的知识后,终于看懂了编译的报错信息,并且做相应修改,能解决相关的编译bug。最终成功了。

      下面就一步一步的记录下我的编译jdk的辛酸路程吧!

  准备环境:

        操作系统:   centos  (linux操作系统下)

        bootstrapJDK:   orcle公司的 jdk7

        targetJDK:        openjdk7

       工具:xshell和xftp

        备注:我是在window下安装的虚拟机,并在虚拟机上装的centos7.0系统,bootstrapJDK和targetJDK,VMware虚拟机以及centos镜像文件我放在了我的网盘里,里面还有我编译好的jdk

 

链接:https://pan.baidu.com/s/1Ogv-JEQjb8Qq2asAwUZedQ 
提取码:b6t9 
 

 

1.下载好文件后,通过xftp上传文件到centos的目录里面:然后解压文件。

编译openjdk详解_第1张图片

2.下载相关的依赖:

yum install zip unzip ant alsa-lib-devel cups-devel libX* gcc gcc-c++ freetype-devel libstdc++-static  make

3.禁用java环境变量。(这样可以避免一些不必要的错误-------------)

   3.1可以通过  vi /etc/profile       在里面添加

                        unset JAVA_HOME    

                       unset   CLASS_PATH 

   3.2也可以   rm -rf /usr/lmj/jvm/openjdk8

   3.3总之:输入java               一定到出现no command java   才行    ,因为在后面我们会通过build.sh来指定bootstrapJDK

4.在openjdk的根目录下创建编译启动的脚本文件-----  build.sh

编译openjdk详解_第2张图片

通过vim 编辑 build.sh          


                        export LANG=C

			export ALT_BOOTDIR=/usr/lmj/jdk1.7.0

			export ALT_JDK_IMPORT_PATH=/usr/lmj/jdk1.7.0

			export ALLOW_DOWNLOADS=true

			export HOTSPOT_BUILD_JOBS=4

			export ALT_PARALLEL_COMPILE_JOBS=4

			export SKIP_COMPARE_IMAGES=true

			export USE_PRECOMPILED_HEADER=true

			export BUILD_LANGTOOLS=true

			#export BUILD_JAXP=false

			export BUILD_JAXWS=false

			#export BUILD_CORBA=false

			export BUILD_HOTSPOT=true

			export BUILD_JDK=true

			export DISABLE_HOTSPOT_OS_VERSION_CHECK=ok

			export SKIP_DEBUG_BUILD=false

			export SKIP_FASTDEBUG_BUILD=true

			export DEBUG_NAME=debug

			BUILD_DEPLOY=false

			BUILD_INSTALL=false

			export ALT_OUTPUTDIR=/usr/lmj/openjdk7/openjdk/build

			unset JAVA_HOME

			unset CLASSPATH

			make sanity

                        make sanity && make 2>&1 | tee $ALT_OUTPUTDIR/build.log

 

  export ALT_BOOTDIR=/usr/lmj/jdk1.7.0                     -----------------你自己的bootstrapJDK路径

   export ALT_JDK_IMPORT_PATH=/usr/lmj/jdk1.7.0    -----------------你自己的bootstrapJDK路径

创建文件:

编译openjdk详解_第3张图片

export ALT_OUTPUTDIR=/usr/lmj/openjdk7/openjdk/build       -----------------指定编译好的jdk的存放路径

 make sanity && make 2>&1 | tee $ALT_OUTPUTDIR/build.log        ------------指定编译jdk时的日志的存放路径

 

进入到openjdk目录:运行开始编译:

  4.统一解决bug:

      1.

        cannot open /usr/lmj/openjdk7/openjdk/!  

         可能是build.sh里面的java环境变量配置的不对,检查build.sh的配置

         还可能是没有禁用java环境变量。

     2.

      cc1plus: all warnings being treated as errors

      这个错误应该都会遇到的吧,应为openjdk的编译在配置的加上了-Werror ,该参数含义是遇到警告就停止编译,但实际编译会遇到很多警告,那怎么行呢,所以必须干掉他。先看Makefile里面有没有改参数,有则注释掉,然后干掉gcc.make里面的参数:如果不注释,/usr/lmj/openjdk7/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp文件里面里就会报重复定义类,已经定义过类的错误(refinition of 'class RuntimeHistogramElement')。当然你可以不干掉参数。自己手动修复每一个warning

(不建议这样干,后面会有无数的warning等着你,会疯掉的)

     

         这是hotspot针对不同平台的编译配置,如果是在window下,就干掉window里面的就可以了(我的是linux的)

编译openjdk详解_第4张图片

       3.

        unzip:  cannot find or open /usr/lmj/openjdk7/openjdk/build-debug/corba/dist/lib/src.zip
        安装zip和unzip就可以了          -------------------------------yum install zip unzip

       4.

        gcc: error: unrecognized command line option '-mimpure-text'  

        gcc版本问题,这个命令在版本的gcc中已经去除,既然不能降低gcc版本,那 我们就干掉-mimpure-text 该参数
        
编译openjdk详解_第5张图片

     5.  

          time is more than 10 years from present: 1136059200000

         现在的时间超过了预定时间的10年期限。将CurrencyData.properties中的时间都换成最新的当前时间即可

编译openjdk详解_第6张图片

         大约等个10~20分钟就编译完成了

         编译openjdk详解_第7张图片

         后续就可以开始代码调试jdk了

 

 

 

 

   

 

 

 

你可能感兴趣的:(java基础,jvm)