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

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

参考文章:


a. https://blog.csdn.net/manageer/article/details/72812149


b.https://blog.csdn.net/lizhengjava/article/details/60138890


c.https://www.cnblogs.com/Seeasunnyday/p/9368302.html(主要是参考这篇文章, 但是包error  # <iostream> not found, 后来有参考的其他文章解决这个问题)

 

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,如图:


微信图片_20220509102415.png


把这里的下载地址前面的域名弄错了,应该是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 进入恢复模式. 在弹出的面板上是没有终端的,终端要去上面的菜单栏选择.


其他: 如果不知道xcode-select是什么, 可以参考这篇文章: https://blog.csdn.net/chenyufeng1991/article/details/47007979


(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

 

我只安装了Xcode-select , 在源码make install的时候报异常 # <iostream> not found. 找了好久解决办法也没找到, 但感觉和Xcode有关系. 所以, 开始安装Xcode.

 

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" 5

 

(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);

  }


(3). 修改openjdk/hotspot/src/share/vm/opto/loopPredicate.cpp


  修改775行为

  assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int()->_lo >= 0, "must be");


(4).修改openjdk/hotspot/src/share/vm/runtime/virtualspace.cpp

  修改331行为

  if (base() != 0) {


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=false


最后干掉这两个变量,不然会有诡异的事发生


unset JAVA_HOME


unset CLASSPATH


将变量添加到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.8` --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++

 

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


jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home --enable-ccache

1

 

版权声明:本文为CSDN博主「ykd2020」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。


原文链接:https://blog.csdn.net/yuankundong/article/details/78876523

 

 

使用这种方式编译, 在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 COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' CC=clang USE_CLANG=true LP64=1

 

我使用的是第一个: make CONF=macosx-x86_64-normal-server-release clean因为我的文件夹下没有第二个


编译成功如图:

微信图片_20220509102446.png

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


问题1和问题2是原作者遇到的,我并没有遇到. 后面的问题是我遇到的


(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:  如图:


微信图片_20220509102516.png


(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没有进行软链有关系. 我第一次操作的时候没有进行软链


/Users/luoxiaoli/java/openjdk/hotspot/src/share/vm/adlc/adlc.hpp:35:10: fatal error: 'iostream' file not found

#include <iostream>

        ^~~~~~~~~~

 

 

 

 

7.测试是否编译成功


  cd ./openjdk/build/macosx-x86_64-normal-server-release/jdk/bin


  执行java -version


  如图则编译成功:

微信图片_20220509102609.png

相关文章
|
9月前
|
前端开发 安全 测试技术
Postman Mac 版安装终极指南:从下载到流畅运行,一步到位
Postman 是 API 开发与测试的高效工具,支持各类 HTTP 请求调试与团队协作。本文详解 Mac 版下载、安装步骤,助你快速上手。同时推荐一体化 API 协作平台 Apifox,集文档、调试、测试于一体,提升开发效率与团队协同能力。
|
9月前
|
应用服务中间件 Nacos nginx
黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
本文为 Mac 用户介绍微服务项目环境搭建,含阿里云服务器用 Docker 装 Nacos 1.2.0,本地通过 brew 装 OpenJDK 8、Maven 3.6.1、Redis,Docker 部署 MySQL 5.7 并配字符集,及 Nginx 安装与反向代理设置,附命令与配置步骤。
561 4
黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
|
iOS开发 MacOS Windows
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
|
iOS开发 MacOS 索引
在不受支持的 Mac 上安装 macOS Tahoe 26
在不受支持的 Mac 上安装 macOS Tahoe 26
992 0
在不受支持的 Mac 上安装 macOS Tahoe 26
|
Oracle Java 关系型数据库
Mac电脑上安装和配置Flutter开发环境
Mac电脑上安装和配置Flutter开发环境
1120 158
|
Ubuntu Linux Shell
Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式
通过这个过程,用户不仅可以定制自己的桌面外观,还可以学习到更多关于 Linux 系统管理的知识,从而更好地掌握系统配置和主题管理的技巧。
2631 12
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10436 2
|
开发工具 git 开发者
「Mac畅玩鸿蒙与硬件3」鸿蒙开发环境配置篇3 - DevEco Studio插件安装与配置
本篇将专注于如何在 DevEco Studio 中安装和配置必要的插件,以增强开发功能和提升效率。通过正确配置插件,开发流程能够得到简化,开发体验也会更加顺畅。
711 1
「Mac畅玩鸿蒙与硬件3」鸿蒙开发环境配置篇3 - DevEco Studio插件安装与配置
|
开发工具 iOS开发 开发者
「Mac畅玩鸿蒙与硬件2」鸿蒙开发环境配置篇2 - 在Mac上安装DevEco Studio
本篇将专注于如何在 Mac 上安装鸿蒙开发工具 DevEco Studio,确保开发环境能够顺利搭建。完成安装后,可以正式开始鸿蒙应用的开发工作。
1600 1
「Mac畅玩鸿蒙与硬件2」鸿蒙开发环境配置篇2 - 在Mac上安装DevEco Studio