基于Linux编译JDK18
1.概述
JDK都没手动编译过,敢说自己是Java程序员吗?(By 羊哥——JDK都没手动编译过,敢说自己是Java程序员吗?实战编译Java源码(JDK源码,JVM)视频教程_哔哩哔哩_bilibili)
- 自己动手编译JDK理论上可以得到更适合自己电脑的JDK
- 可以自己在源码中加入自己的DIY部分,或许会好玩?
- 阅读JDK源码的时候可以修改测试一些功能,在源码中加入自己的笔记
本文基于Ubuntu虚拟机,使用JDK17编译JDK18(应该是目前官方最新的release版本)
2.安装Ubuntu虚拟机
安装好虚拟机软件,笔者使用的是VMware
在Ubuntu官网下载好UbuntuISO镜像,笔者下载的是Ubuntu20.04 desktop
下载地址为:
下载好后启动VMware,设置虚拟机的一些配置信息,建议配置给大一点,毕竟是编译程序,CPU核心多一点会比较快
配置好后挂载ISO镜像,启动虚拟机,配置Ubuntu的一些信息(主要是密码),等待安装完成

3.配置Ubuntu
3.1. 配置SSH(可选)
配置SSH工具后就可以在虚拟机外进行SSH连接并操作,当然,可以直接在虚拟机内操作
sudo apt install openssh-server
参考链接:如何在Ubuntu 20.04上启用SSH - GlaryJoker - 博客园 (cnblogs.com)
3.2. 下载vim(可选)
vim是Linux上普遍使用的终端文本编辑工具,当然,可以选择其他文本工具
sudo apt install vim
3.3. 配置安装源
Ubuntu自带的安装源比较慢,此处笔者配置的是阿里云的源
参考链接:
ubuntu镜像-ubuntu下载地址-ubuntu安装教程-阿里巴巴开源镜像站 (aliyun.com)
备份原文件(可选):
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
删除原文件:
sudo rm -rf /etc/apt/sources.list
编辑镜像文件:
sudo vim /etc/apt/sources.list
粘贴入镜像站给出的地址:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
4.安装编译工具
根据openjdk官方给出的编译指导(Building the JDK (java.net)),分别需要安装以下工具:
4.1. 工具链(Toolchain)
sudo apt-get install build-essential
4.2. 基础JDK(Boot JDK)
需要邻近版本的JDK,一般选用前一个版本
sudo apt-get install openjdk-17-jdk
4.3. 链接库(External Library)
4.3.1. FreeType
sudo apt-get install libfreetype6-dev
4.3.2. CUPS
sudo apt-get install libcups2-dev
4.3.3. X11
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
4.3.4. ALSA
sudo apt-get install libasound2-dev
4.3.5. libffi
sudo apt-get install libffi-dev
4.4. 构建工具(Build Tools)
4.4.1. Autoconf
需要最低版本2.69
sudo apt-get install autoconf
4.4.2. GNU Make
需要最低版本3.81
4.4.3. GNU Bash
需要最低版本3.2
5. 配置Configure
具体配置项请看:
此处默认配置
6. 配置Make
具体配置项请看:
此处默认配置
7. 编译JDK
生成配置
bash configure
- 如果依赖库没装完或者存在问题,请根据输出的提示安装或者修改
编译全部
make all
8. 编译输出
编译完成后编译后的文件在build文件夹下
查看文件:
zhanny@ubuntu:~/Downloads/jdk18$ ls build/linux-x86_64-server-release/
bootcycle-spec.gmk build.log.old configure.log images make-support
buildjdk-spec.gmk buildtools configure-support jdk spec.gmk
build.log compare.sh hotspot Makefile support
其中images就是release文件夹
zhanny@ubuntu:~/Downloads/jdk18$ ls build/linux-x86_64-server-release/images/
docs docs-javase docs-reference gengraphs jdk jmods sec-bin.zip symbols test
images下的jdk的bin下就是常见的Java编译器
zhanny@ubuntu:~/Downloads/jdk18$ ls build/linux-x86_64-server-release/images/jdk/bin/
jar jconsole.debuginfo jlink jstack.debuginfo
jar.debuginfo jdb jlink.debuginfo jstat
jarsigner jdb.debuginfo jmap jstatd
jarsigner.debuginfo jdeprscan jmap.debuginfo jstatd.debuginfo
java jdeprscan.debuginfo jmod jstat.debuginfo
javac jdeps jmod.debuginfo jwebserver
javac.debuginfo jdeps.debuginfo jpackage jwebserver.debuginfo
java.debuginfo jfr jpackage.debuginfo keytool
javadoc jfr.debuginfo jps keytool.debuginfo
javadoc.debuginfo jhsdb jps.debuginfo rmiregistry
javap jhsdb.debuginfo jrunscript rmiregistry.debuginfo
javap.debuginfo jimage jrunscript.debuginfo serialver
jcmd jimage.debuginfo jshell serialver.debuginfo
jcmd.debuginfo jinfo jshell.debuginfo
jconsole jinfo.debuginfo jstack
9. 参考资料
[1]Building the JDK (java.net)
[2]openjdk/jdk18: JDK 18 development (github.com)
[3]真·手把手,从头教你编译JDK - 简书 (jianshu.com)
[4]实战:自己编译JDK - 简书 (jianshu.com)
基于Linux编译JDK18的更多相关文章
- 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化
高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...
- 浅谈基于Linux的Redis环境搭建
本篇文章主要讲解基于Linux环境的Redis服务搭建,Redis服务配置.客户端访问和防火强配置等技术,适合具有一定Linux基础和Redis基础的读者阅读. 一 Redis服务搭建 1.在根路径 ...
- Linux系统启动那些事—基于Linux 3.10内核【转】
转自:https://blog.csdn.net/shichaog/article/details/40218763 Linux系统启动那些事—基于Linux 3.10内核 csdn 我的空间的下载地 ...
- 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012
本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...
- 基于linux下的NIST数字测试包安装过程
基于linux下的NIST数字测试包安装过程 1. 首先解决windows文件不能粘贴到Ubuntu的问题 选择利用VMware Tools进行解决 打开虚拟机VMware Workstation,启 ...
- 基于Linux平台的libpcap源码分析和优化
目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1 数据包基本捕包流程... 2 2.2 libpcap捕包过程... ...
- 基于 Ubuntu 编译 windows 版 adb
. . . . . adb 的源码在 Android 源码树中,所以只能在 Linux 下编译,而在 Linux 下编译 windows 版本的应用就需要使用交叉编译器 MinGW 了. 环境: Ub ...
- 【转】linux 编译安装nginx,配置自启动脚本
linux 编译安装nginx,配置自启动脚本 本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装ng ...
- 轻易实现基于linux或win运行的聊天服务端程序
对于不了解网络编程的开发人员来说,编写一个良好的服务端通讯程序是一件比较麻烦的事情.然而通过EC这个免费组件你可以非常简单地构建一个基于linux或win部署运行的网络服务程序.这种便利性完全得益于m ...
- linux编译中的常见问题
转linux编译中的常见问题 错误提示:Makefile:2: *** 遗漏分隔符 . 停止. 原因makefile中 gcc语句前 缺少一个 tab分割符 错误提示: bash: ./makefil ...
随机推荐
- 【十次方微服务后台开发】Day02:加密与JWT鉴权、微服务注册中心、配置中心、熔断器、网关、消息总线、部署与持续集成、容器管理与监控Rancher、influxDB、grafana
一.密码加密与微服务鉴权JWT 1.BCrypt密码加密 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用B ...
- 【大数据面试】Hbase:数据、模型结构、操作、读写数据流程、集成、优化
一.概述 1.概念 分布式.可扩展.海量数据存储的NoSQL数据库 2.模型结构 (1)逻辑结构 store相当于某张表中的某个列族 (2)存储结构 (3)模型介绍 Name Space:相当于数据库 ...
- 我做了第一个ChatGPT .net api聊天库
最近这个ChatGPT很火啊,看了B站上很多视频,自己非常手痒,高低自己得整一个啊,但是让我很难受的是,翻遍了github前十页,竟然没有一个C#的ChatGPT项目,我好难受啊!那能怎么办?自己搞一 ...
- Blazor组件自做十三: 使用 Video.js 在 Blazor 中播放视频
Video.js 是一个具有大量功能的流行的视频和音频 JavaScript 库,今天我们试试集成到 Blazor . Blazor VideoPlayer 视频播放器 组件 示例 https://b ...
- CH32V307以太网(芯片内部10M)
用过WCH的CH579M或者CH563的话,就会发现CH32V307这个自带的10M以太网代码编写与前两颗芯片流程十分相似.部分区别就在于初始化方面. 代码流程依旧按照 初始化--->等待PHY ...
- 聊一聊 SQLSERVER 的行不能跨页
一:背景 1. 讲故事 相信有很多朋友在学习 SQLSERVER 的时候都听说过这句话,但大多都是记忆为主,最近在研究 SQLSERVER,所以我们从 底层存储 的角度来深入理解下. 二:理解数据页 ...
- 使用 Helm 安装 MQTT 服务器-EMQX
EMQX ️ Info: 使用 EMQX 通过 Helm3 在 Kubernetes 上部署 EMQX 4.0 集群 | EMQ emqx/deploy/charts/emqx at main-v4. ...
- centos更新glibc-2.28
vps安装alist时提示glibc版本太老,找了一圈教程,就这个解决了问题. 原文: https://www.cnblogs.com/FengZeng666/p/15989106.html
- python之路27 单例模式实现方式、pickle模块、选课系统目录搭建
单例模式实现的多种方式 单例1:(提前定义一个名字) class C1: __instance = None def __init__(self,name,age): self.name = name ...
- YMOI 2019.6.29
题解 YMOI 2019.6.29 放弃FAIOJ,用cena考了一次试.被全方位吊打.. T1 开灯 题面: 在一条无限长的路上,有一排无限长的路灯,编号为1,2,3,4,--. 每一盏灯只有两种可 ...