第一篇: openJDK源码编译安装--mac版本

1.为何要编译JDK

  想要一探JDK内部的实现机制,最便捷的路径之一就是本身编译一套JDK,经过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛高一点,但确定比阅读各类书籍,文章,博客更在贴切一点,另外,JDK的不少方法都是本地化(Native)的,须要跟踪这些方法的运做或对JDK进行Hack的时候,都须要本身编译一套JDK。
 

2.选择JDK

  如今网上有很多开源的JDK实现能够供咱们选择,如Apache Harmony,OpenJDK等,考虑到Sun系列的JDK是如今使用得最普遍的JDK版本,因此咱们选择openJDK进行编译。
关于openJDK?
  openJDK是sun在2006年底把java开源而造成的项目。开源是一般意义上的源码形式上开放,等同于源码可被复用。商业版的oracle jdk和open jdk 除了版权注释以外,其他代码基本上都是相同的,都是创建在二者共有的组件基础上。oracle jdk还会存在一些open jdk没有的,商用闭源的功能。oracle的项目发布经理Joe Darcy 在OSCON2011 上对二者的关系上也证明了oracle jdk和open jdk程序上市很是接近。
 

3.环境准备

1.openJDK下载,获取openJDk源码有两种方式.
  (1)其中一种是经过一款代码版本管理Mercurial上获取
    hg clone http://hg.openjdk.java.net/jdk8/jdk8 jdk8
    cd jkd8
    bash ./get_source.sh
  这种是最直接的方式,可是因为文件不少,国内的网络对Mercurial不如对git svn上不够快,常常可能失败,能够把镜像换成国内的,这个能够本身找找。
  (2)从 https://download.java.net/openjdk/jdk8直接下载打包好的源码文件,这里openjdk在下载源码有个bug,如图:
  
把这里的下载地址前面的域名弄错了,应该是http://download.java.net,把前面的http://www.java.net/download/换掉,后面的不变,就能下载打包好的源码文件。参考1.7地址: http://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip
最终的地址: http://download.java.net/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip
 
2.安装依赖软件,若是没有brew命令,能够先看看brew怎么安装再继续执行以上安装命令。
(1)Xcode-select:安装命令:xcode-select –install  进行x11连接
  sudo ln -s /usr/X11/include/X11 /usr/include/X11 or sudo ln -s /usr/local/X11/include/X11 /usr/include/X11  (若是软链接失败,重启mac时按住command+R 进入恢复模式,而后打开terminal  执行 csrutil disable,再重启,这是mac对安全的一种校验)
这里重点说一句: 重启mac时按住command+R 进入恢复模式. 在弹出的面板上是没有终端的,终端要去上面的菜单栏选择. 
这一步很重要, 包括软链,若是不操做, 后面编译会报异常
(2)安装XQuartz 下载地址: https://www.xquartz.org/
(3)安装freetype,安装命令:brew install freetype
(4)安装GC 安装命令: brew install gcc49 听说安装往上的版本会报错。
(5) 安装ccache提高编译速度 brew install ccache
(6) 安装ant 通常mac都会有这个环境,若是没有执行:brew install ant
 
 
3.修改源码

(1). 修改generated-configure.sh(路径:common/autoconf/generated-configure.sh)
  注释20061行
  // as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
  注释21640行
  // as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5java

 

(2). 修改relocInfo.hpp(路径:hotspot/src/share/vm/code/relocInfo.hpp)
  修改367行
  inline friend relocInfo prefix_relocInfo(int datalen);
  修改472行
  inline relocInfo prefix_relocInfo(int datalen = 0) {
    assert(relocInfo::fits_into_immediate(datalen), "datalen in limits");
    return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen);
  }ios


(3). 修改openjdk/hotspot/src/share/vm/opto/loopPredicate.cpp
  修改775行为
  assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int()->_lo >= 0, "must be");c++


 (4).修改openjdk/hotspot/src/share/vm/runtime/virtualspace.cpp
  修改331行为
  if (base() != 0) {git

4.设置环境变量

  cd ~
  open .bash_profile (这个在安装jdk都会设置的,若是没有这个文件去看看jdk安装的教程)
添加变量:


# 设定语言选项,必须设置
export LANG=C
# Mac平台,C编译器再也不是GCC,是clang
export CC=clang
# 跳过clang的一些严格的语法检查,否则会将N多的警告做为Error
export COMPILER_WARNINGS_FATAL=false
# 连接时使用的参数
export LFLAGS='-Xlinker -lstdc++'
# 是否使用clang
export USE_CLANG=true
# 使用64位数据模型
export LP64=1
# 告诉编译平台是64位,否则会按32位来编译
export ARCH_DATA_MODEL=64
# 容许自动下载依赖
export ALLOW_DOWNLOADS=true
# 并行编译的线程数,编译时间长,为了避免影响其余工做,我选择为2
export HOTSPOT_BUILD_JOBS=2
export ALT_PARALLEL_COMPILE_JOBS=2
# 是否跳过与先前版本的比较
export SKIP_COMPARE_IMAGES=true
# 是否使用预编译头文件,加快编译速度
export USE_PRECOMPILED_HEADER=true
# 是否使用增量编译
export INCREMENTAL_BUILD=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 SKIP_DEBUG_BUILD=true
export SKIP_FASTDEBUG_BUILD=false
export DEBUG_NAME=debug
# 避开javaws和浏览器Java插件之类的部分的build
export BUILD_DEPLOY=false
export BUILD_INSTALL=falsemacos

最后干掉这两个变量,否则会有诡异的事发生
unset JAVA_HOME
unset CLASSPATHvim

 将变量添加到base_profile之后, 把中午注释去掉, 不然会乱码,编译报错

5.编译, ( 遇到问题能够先看看下面的问题描述)

(1)cd 到下载好的openSDK目录下,先授予权限给openJDK目录 如: chmod -R 777 openjdk
 
(2)./configure 若是找不freetype 能够执行./configure --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/
 

sh configure --with-debug-level=slowdebug --with-boot-jdk=`/usr/libexec/java_home -v 1.7` --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/ --with-target-bits=64 --with-jvm-variants=server --with-jdk-variant=normal --with-milestone=internal --with-update-version=b25 --with-build-number=b25 --with-zlib=system --with-num-cores=2 --with-jobs=4 CC=clang CXX=clang++xcode

使用这种方式编译, 在build文件夹生成两个文件. 若是使用第一种, 只会生成一个浏览器

参考文章: https://blog.csdn.net/lizhengjava/article/details/60138890安全

 
  (3) 开始执行make命令: 在执行make命令须要指定编译环境,环境路径在:./openjdk/build/下面 通常有两个 macosx-x86_64-normal-server-release 和 macosx-x86_64-normal-server-slowdebug
  若是通常编译失败会有失败的文件,为了保险起见先执行:
    make CONF=macosx-x86_64-normal-server-release clean 或者
    make CONF=macosx-x86_64-normal-server-slowdebug clean
  再执行:
    make CONF=macosx-x86_64-normal-server-release install 或者
    make CONF=macosx-x86_64-normal-server-slowdebug install
 
我使用的是第一个: make CONF=macosx-x86_64-normal-server-release clean由于个人文件夹下没有第二个
编译成功如图:
  

6.我执行./configure和编译遇到的问题:

问题1和问题2是原做者遇到的,我并无遇到. 后面的问题是我遇到的bash

(1)./configure问题: configure: error: GCC compiler is required
  解决方法:
   jdk8/common/autoconf/generated-configure.sh文件中 注释两处代码:第20061,21640行 #as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
 
  (2)make问题:
  Running nasgen
  Exception in thread "main" java.lang.VerifyError:
  class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final method setPrototype.(Ljava/lang/Object;)V
  解决方法:
  修改:vim ./openJDk/nashorn/make/BuildNashorn.gmk
  80行原来 -cp 修改成:-Xbootclasspath/p:  如图: 
  
 (3) 在执行sudo ln -s /usr/X11/include/X11 /usr/include/X11 的时候提示:  sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
 
  这个问题的缘由是提示sudo没有权限, 最终结觉办法是, 使用root用户登陆. 而后将/usr/bin/sudo 授与4755权限
  若是不知道怎么使用root用户登陆, 能够看这篇文章: https://www.jianshu.com/p/be9f1d57c710.   我是重置了root的密码, 由于不知道原密码是什么, 而后退出当前用户, 使用root从新登陆. 
  执行: chmod 4755 /usr/bin/sudo 就可使用了
 
  (4) 在root用户受权sudo之后, 回到luo***用户登陆的时候, 终端显示异常. 内容以下:

  Could not determine audit condition  [Process completed]

  [进程已完成]

   处理办法参考:  https://www.jianshu.com/p/d764d2840071. 不少说是由于./bash_profile文件配置错误致使的, 但我这个不是. 将/usr/bin 下的login文件更名login1, 再打开终端, 而后执行

  sudo chown root:wheel /usr/bin/login

  sudo chmod u+s /usr/bin/login

  在将login1的名字改回login. 已经恢复了.

 (4) 报异常<iostream> not found. 这个问题应该是和Xcode没有进行软链有关系. 我第一次操做的时候没有进行软链
 
 
(5) 
7.测试是否编译成功
  cd ./openjdk/build/macosx-x86_64-normal-server-release/jdk/bin
  执行java -version
  如图则编译成功:
   
相关文章
相关标签/搜索