答案是缺失完整构建工具链,需安装gcc、g++、make、autoconf等及对应-devel包,并加--disable-warnings-as-errors参数。OpenJDK编译要求严格,不仅需C编译器,还依赖C++编译器、调试库、字体与X11开发包,且现代GCC警告默认被视作错误,必须禁用。

源码编译安装 JDK 不是常规运维或开发的首选方式,它只在极少数场景下真正必要:比如定制 JVM 参数、调试 HotSpot 源码、做安全加固裁剪、或参与 OpenJDK 社区贡献。对绝大多数人来说,apt install openjdk-17-jdk 或解压二进制包配 JAVA_HOME 就够了——编译 JDK 是耗时、吃内存、易出错的重操作。
为什么 configure 会报 “no acceptable C compiler found”
OpenJDK 编译依赖完整的构建工具链,不是装个 gcc 就完事。常见缺失项包括:g++(C++ 编译器)、make、autoconf、zip、libfreetype6-dev(字体渲染)、libx11-dev(X11 支持)等。CentOS/RHEL 还要额外装 gcc-c++ 和 glibc-devel。
- Ubuntu/Debian:运行
sudo apt install build-essential libfreetype6-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev libasound2-dev libffi-dev autoconf - CentOS/RHEL:用
sudo yum groupinstall "Development Tools"+sudo yum install alsa-lib-devel libXtst-devel libXrender-devel freetype-devel libX11-devel libXext-devel libffi-devel autoconf - 注意:
configure脚本默认检查cc,但实际需要gcc和g++同时可用;若系统有多个 GCC 版本(如gcc-11),需用export CC=gcc-11 CXX=g++-11显式指定
configure 参数必须加 --disable-warnings-as-errors
现代 GCC(≥10.x)和 Clang 对字符串截断、未初始化变量等会发出警告,默认被 OpenJDK 的 configure 视为错误(fail-fast),导致直接退出。不加这个参数,configure 几乎必挂。
- 正确写法示例:
bash configure --with-conf-name=linux-x64 --enable-debug --disable-warnings-as-errors --with-jvm-variants=server --with-boot-jdk=/usr/lib/jvm/java-17-openjdk-amd64 -
--with-boot-jdk是硬性要求:必须指定一个已安装的、能跑起来的 JDK(版本需满足 n-1 规则,如编译 JDK 21 需用 JDK 20+) -
--enable-debug会生成带调试符号的 build,体积大、启动慢,仅用于开发调试;生产构建应改用--with-debug-level=release
make 编译失败后别直接重试
OpenJDK 构建过程复杂,中间产物(build/ 目录)状态极易污染。一次失败后直接 make 很可能复现相同错误,甚至引发新问题。
- 清理务必用:
make clean(清构建输出)→make dist-clean(清 configure 生成的脚本和缓存)→ 再次bash configure ... - 不要手动删
build/;某些子模块(如hotspot)有自己的 Makefile,残留文件会导致链接失败 - 内存不足是静默失败主因:编译 JDK 21 单线程需 ≥8GB RAM,推荐用
make JOBS=2控制并发数(避免 OOM kill)
最后提醒:编译出来的 JDK 默认不带 jpackage、jlink 等工具(除非显式启用 --enable-jvmci 或 --with-jvm-features),且无法通过 update-alternatives 管理。它更像一个“自研内核”,而不是开箱即用的发行版——你得自己负责后续的部署、权限、更新和安全补丁。


















