为啥要编译 jdk

通常来说编译 OpenJDK 的目的是为了调试、定制化等需求;和我们使用开源的 Java 中间件一样,如果需要做定制化的话,可以将其源代码下载下来再修改,然后打包出来使用。

准备编译环境

安装 gcc

apt-get install build-essential

安装工具软件项

apt-get install libfreetype6-dev
apt-get install libcups2-dev
apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
apt-get install libasound2-dev
apt-get install libffi-dev
apt-get install autoconf
apt-get install zip
apt-get install libfontconfig1-dev

安装 jdk,该 jdk 是为了编译 openjdk,本次准备编译 openjdk-12,环境要求安装 N-1 版本的 jdk,所以安装 openjdk-11

apt-get install openjdk-11-jdk

下载 OpenJDK

wget https://github.com/openjdk/jdk/archive/refs/tags/jdk-12-ga.tar.gz

解压缩

tar -zxvf jdk-12-ga.tar.gz

进入 jdk 目录

cd jdk-jdk-12-ga

编译配置

开始编译配置,FastDebug 版、仅包含 Server 模式的 HotSpot 虚拟机

bash configure --enable-debug --with-jvm-variants=server

参数介绍祥见 附录

如果失败,控制台会告诉我们缺少的依赖项,按提示安装需要的依赖即可

配置成功,会看到

A new configuration has been successfully created in
/app/jdk-jdk-12-ga/build/linux-x86_64-server-fastdebug
using configure arguments '--enable-debug --with-jvm-variants=server'.Configuration summary:
* Debug level:    fastdebug
* HS debug level: fastdebug
* JVM variants:   server
* JVM features:   server: 'aot cds cmsgc compiler1 compiler2 epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs zgc'
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 12-internal+0-adhoc.root.jdk-jdk-12-ga (12-internal)Tools summary:
* Boot JDK:       openjdk version "11.0.12" 2021-07-20 OpenJDK Runtime Environment (build 11.0.12+7-post-Debian-2deb10u1) OpenJDK 64-Bit Server VM (build 11.0.12+7-post-Debian-2deb10u1, mixed mode, sharing)  (at /usr/lib/jvm/java-11-openjdk-amd64)
* Toolchain:      gcc (GNU Compiler Collection)
* C Compiler:     Version 8.3.0 (at /usr/bin/gcc)
* C++ Compiler:   Version 8.3.0 (at /usr/bin/g++)Build performance summary:
* Cores to use:   4
* Memory limit:   3867 MB

开始编译

make images

编译完成

编译完成之后,进入OpenJDK源码的build/配置名称/jdk目录下就可以看到OpenJDK的完整编译结果了,把它复制到JAVA_HOME目录,就可以作为一个完整的JDK来使用

附录:编译配置参数说明

  • –with-debug-level=:设置编译的级别,可选值为release、fastdebug、slowde-bug,越往后进行的优化措施就越少,带的调试信息就越多。还有一些虚拟机调试参数必须在特定模式下才可以使用。默认值为release。
  • –enable-debug:等效于–with-debug-level=fastdebug。
  • –with-native-debug-symbols=:确定调试符号信息的编译方式,可选值为none、internal、external、zipped。
  • –with-version-string=:设置编译JDK的版本号,譬如java-version的输出就会显示该信息。这个参数还有–with-version-=的形式,其中part可以是pre、opt、build、major、minor、security、patch之一,用于设置版本号的某一个部分。
  • –with-jvm-variants=[,…]:编译特定模式(Variants)的HotSpot虚拟机,可以多个模式并存,可选值为server、client、minimal、core、zero、custom。
  • –with-jvm-features=[,…]:针对–with-jvm-variants=custom时的自定义虚拟机特性列表(Features),可以多个特性并存,由于可选值较多,请参见help命令输出。
  • –with-target-bits=:指明要编译32位还是64位的Java虚拟机,在64位机器上也可以通过交叉编译生成32位的虚拟机。
  • –with-=:用于指明依赖包的具体路径,通常使用在安装了多个不同版本的Bootstrap JDK和依赖包的情况。其中lib的可选值包括boot-jd、freetype、cups、x、alsa、libffi、jtreg、libjpeg、giflib、libpng、lcms、zlib。
  • –with-extra-=:用于设定C、C++和Java代码编译时的额外编译器参数,其中flagtype可选值为cflags、cxxflags、ldflags,分别代表C、C++和Java代码的参数。
    ·–with-conf-name=:指定编译配置名称,OpenJDK支持使用不同的配置进行编译,默认会根据编译的操作系统、指令集架构、调试级别自动生成一个配置名称,譬如“linux-x86_64-server-release”,如果在这些信息都相同的情况下保存不同的编译参数配置,就需要使用这个参数来自定义配置名称。

以上是configure命令的部分参数,其他未介绍到的可以使用bash configure--help来查看

参考书籍

  • 《深入理解Java虚拟机》

编译 OpenJDK相关推荐

  1. 深入理解JVM(一)编译openJDK

    此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好, ...

  2. 走进JVM之一 自己编译openjdk源码

    想要深入了解JVM,就必须了解其实现机制.了解JVM实现的最好方法便是自己动手编译JDK.好了,让我们开始吧! 1.  准备工作 获取OpenJDK源码 本次编译选择的是OpenJDK7u,官方源码包 ...

  3. 菜鸟编译OPenJDK全过程记录

    2019独角兽企业重金招聘Python工程师标准>>> 最近在看周志明的<深入理解java虚拟机>,其中第一章就是讲如何自己编译OpenJDK,根据书中介绍步骤,结合网上 ...

  4. Java虚拟机(JVM源码):编译OpenJDK源码

    为什么要自己编译JDK源码 作为一个搞技术的同学,如果想在技术这条路上走下去,还是多研究些本质性的东西,修炼下内功.尤其是现在JDK都出到10了,如果你没有研究过,还是停留在之前的时代,那么确实说不过 ...

  5. CentOS 编译 openjdk

    1. 概述 <<深入理解Java虚拟机--JVM高级特性与最佳实践>>第一章就谈到自己编译jdk,来吧. 2.  编译环境 VMware12 CentOS-7-x86_64-E ...

  6. 自己动手编译OpenJDK

    个人技术博客:www.zhenganwen.top 笔者环境 64bit / Windows10 / i5-7200U / 4核心CPU,在虚拟机上的Centos7(能连外网)上编译OpenJDK7u ...

  7. LINUX编译OpenJDK 9

    比起初次编译顺利多了. 下载源码 Tags · openjdk/jdk9u · GitHub Tags · openjdk/jdk9 · GitHub 吾下载的是jdk-jdk-9-181.tar.g ...

  8. 编译OpenJDK及JDK题外话

    一:下载并安装JDK,设置JDK环境变量 二:下载openjdk源码 三:下载apache ant jdk的1.7版本安装好后(安装在系统盘真的好吗?)不需要配置环境变量就可以使用,均等说理由是Ide ...

  9. 编译openjdk源码

    http://www.cnblogs.com/ACFLOOD/p/5528035.html

最新文章

  1. STM32配置一般过程(持续更新中)
  2. mysql中出现 xC4 xDD_mysql数据库调优总结(二)
  3. SSHF备忘之依赖包(struts2+spring2.5+hibernate+freemarker)
  4. .NET Core 2.0 特性介绍和使用指南
  5. gnss单频软件接收机应用与编程_GNSS/GPS RTK定位 (手机,无人车定位,无人驾驶,因子图优化)...
  6. 关于lucene2.2部分代码
  7. VS2005 中关于“LC.EXE已退出,代码为 -1”的错误解决方法。
  8. VBA 声明 Option Explicit,让代码更规范
  9. Oracle约束的使用
  10. android studio撤回快捷键,Android Studio常用快捷键、Android Studio快捷键大全
  11. 晨曦记账本如何将账本内容导出EXCEL表格
  12. Lwip的udp编程
  13. echarts label加边框_ECharts 教程 富文本标签 - 闪电教程JSRUN
  14. 基于深度学习的行人检测技术
  15. 企业微信一天最多可以加多少人? 企业微信加好友功能会被限制吗?
  16. MediaWiki搭建指导
  17. 坦克大战的网络对战实现C++(客户端+服务端)
  18. OpenMP并行编程计算π值及PSRS排序
  19. 超人气思维导图XMind新年新版本,这6个新功能你一定要看
  20. Flutter高仿微信-第28篇-好友详情-查看个人头像

热门文章

  1. 请描述定时器初值的计算方式_51单片机定时器初值计算方法详解
  2. 嵌入式学习之Linux系统编程---9 目录IO之readdir函数
  3. VSCode通过SSH远程连接CentOS主机的问题解决记录
  4. 关于 网页嵌入字体 的问题
  5. 查询每门课分数最高的学生
  6. jq 获取data id属性
  7. 不会开赛车的管理者不是好的开发人
  8. scrollTop方法无效问题
  9. windows 向注册表添加开机启动项
  10. 等保测评之服务器未配置登录失败锁定策略及登录连接超时自动退出策略