MacOS 本地编译 openJDK11

JDK都没手动编译过,敢说自己是Java程序员吗?实战编译Java源码(JDK源码,JVM)视频教程

奇怪的问题,我第一次是想测试jdk14,结果make images之后,死活不生效,后来改成和视频中一样版本11,成功。

环境支持

  1. bootstrap jdk 你想编译一个 jdk,你必须提前安装一个低一点 jdk(你想编译jdk11 那必须有一个jdk11或则10, 编译jdk14 需要jdk14或jdk13, 版本差太多时,下面执行sh configure时候会提示)
  2. unix like 环境
  3. 编译器/编译工具链

    1. linux: gcc clang
    2. macOS: Apple Xcode(using clang)
    3. Solaris: Oracle Solaris Studio
    4. AIX: IBM XL C/C++
    5. Windows: Microsoft Visual Studioi
  4. 其他支撑工具: autoconf/make/freetype

版本说明

  1. macOS: 10.15.5
  2. bootstarp jdk: 11.0.8 (本地安装的 java -version)
  3. Xcode: 11.5
  4. clang: 11.0.3(本地安装的 clang --version)
  5. clang++: 11.0.3(本地安装的 clang++ --version)
  6. autoconf: 2.69(本地安装的 autoconf --version)
  7. make: 3.81(本地安装的 make --version)
  8. freetype: 2.10.1(本地安装的 freetype-config --ftversion)

操作1:下载JDK源码

  1. 通过 mercurial 轻量级分布式版本控制系统下载(理解为另一种git)

    1. 安装方法: terminal 输入 pip install mercurial 即可
    2. 验证方法: hg --version
    3. jdk源码网址: http://hg.openjdk.java.net/jdk
    4. 下载jdk: hg clone http://hg.openjdk.java.net/jdk/jdk11/
  2. 通过网址下载 http://jdk.java.net/ (选择jdk14 zipfile: https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_src.zip)

操作2:安装

  1. 新建目录 /Users/xuzhihua/Workspace/0x04jdkCompile 目录,并将上面下载到的zip解压到这里,改文件名,得到 /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11
  2. 切换目录 cd /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11
  3. 自动配置 sh configure 注意关注结束时有没有报错 成功的话会输出

    A new configuration has been successfully created in
    /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11/build/macosx-x86_64-server-release
    using default settings.

  4. 真正编译 make all 第一次会全量编译,耗时长,其中的一些告警可忽略不管 成功的话会输出

    Finished building target 'all' in configuration 'macosx-x86_64-server-release'

  5. 编译完成,会在当前目录下生成 build 目录,所有的输出都在这里面

    编译后的目录: /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11/build/macosx-x86_64-server-release/
    编译出来的成品目录: /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11/build/macosx-x86_64-server-release/images/jdk 该内容与在oracle下载的jdk安装后的目录内容基本一样
    编译后的可执行文件目录: /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11/build/macosx-x86_64-server-release/jdk/bin
    验证一下 cd /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11/build/macosx-x86_64-server-release/jdk/bin
    执行 ./java --versionjava --version 即可看到新编译的jdk与之前电脑环境的jdk输出信息

使用: 注释与调试

  1. 打开idea,新建工程 openjdk11CompileTest 的纯java应用,输出 Hello world! 截图如下 使用的jdk是电脑环境之前的jdk11,不是刚刚编译出来的jdk

  2. 更换sdk(按下cmd+; 找到SDKs): 删除之前的jdk,点击➕ add jdk,目录指向 /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11/build/macosx-x86_64-server-release/images/jdk,idea重新扫描文件后,重新允许main方法,截图如下 使用的jdk已经改成了刚刚手动编译的openjdk11

  3. 关联jdk原码(按下cmd+; 在SDKs-Sourcepath),删除这里面所有的内容(这里默认使用生成build下面images里面的src.zip的内容) 这里的源码没法修改 并加注释,故删除掉,然后重新关联,指向目录/Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11/src 这里是真正的源码位置,关联确认后,idea会再次重新扫描文件

  4. 这个时候在main方法里面进 print 方法,截图如下, 即真正源码的位置,关联上了

  5. 修改源码的print方法,添加定制化内容,此时输出没有带出定制化的内容,需要操作步骤6,再运行(!!!注意 添加的定制化内容,注释或者任何东西,不要有中文 老老实实用英文,不然会有错误)

  6. 将步骤5中修改的源码,重新打包生成镜像后 ,在 /Users/xuzhihua/Workspace/0x04jdkCompile/openjdk11 目录下执行 make images (上面make all第一次执行是全量编译,比较慢,这次是增量编译,比较快, emmm 视频里比较快,我的电脑还是老老实实的慢 4min左右),终端下编译成功后,切换到idea,他会自动重新扫描文件,扫描后再运行, 这次输出是成功的,带有定制化信息,断点也可以正常进入(如果断点不能进入,需要看一下上面关联的jdk和sourcepath是不是对的)

  7. 这里的sdk名字,上面例子都是用 11(openJdk11Compile), 但是重新打开idea后,会提示 jdk is configured, 查看 这里会自动在11(openJdk11Compile)的基础上多一个11, 然后从方法点进去的源码内容也变了, 故这里名字改为11,不让他自动切换