在 Ubuntu 16.04 上從源碼編譯 OpenJDK 8 是理解 JVM 內部機制、定製 JDK 或排查底層問題的重要技能。本文匯總官方文檔與實戰踩坑經驗,提供可直接落地的完整步驟。
sudo apt-get update
sudo apt-get install mercurial
# 選擇版本標籤,如 jdk8u60
sudo hg clone https://hg.openjdk.java.net/jdk8u/jdk8u60 jdk8u60
cd jdk8u60
克隆完成後,目錄下會有 README-builds.html,強烈建議閱讀官方構建說明。
sudo sh get_source.sh
此步驟下載 hotspot、langtools、jaxp 等子倉庫,耗時較長,網絡不穩可重試。
執行 bash ./configure 會自動檢測依賴,缺什麼裝什麼。以下是常見必裝包:
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
注意:編譯 JDK 8 需要 JDK 7 作為引導編譯器。
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
關鍵提示:包名中 x 為小寫,官方錯誤提示有時顯示大寫 LIBX11-DEV 導致誤裝。
sudo apt-get install build-essential libfreetype6-dev libcups2-dev libfontconfig1-dev libasound2-dev
bash ./configure \
--with-boot-jdk=/usr/lib/jvm/java-7-openjdk-amd64 \
--with-debug-level=slowdebug \
--enable-debug-symbols \
--with-target-bits=64
--with-boot-jdk:指定 Bootstrap JDK 路徑--with-debug-level=slowdebug:包含調試符號,便於 GDB 調試--enable-debug-symbols:生成調試信息sudo make all
編譯時間視 CPU 核心數而定,通常 30-120 分鐘。可用 make JOBS=<核心數> 並行加速。
build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version
輸出應包含 openjdk version "1.8.0_60-internal" 等信息。
| 錯誤現象 | 原因 | 解決辦法 |
|---|---|---|
| configure: error: Could not find all X11 headers | 缺少 X11 開發庫 | 安裝 libx11-dev 等包(注意小寫) |
| Bootstrap JDK version mismatch | JDK 版本不匹配 | 確保使用 OpenJDK 7,非 Oracle JDK 8 |
| make 過程中網絡下載失敗 | 需下載外部依賴 | 預先下載或配置代理,重試 make |
| 磁盤空間不足 | 構建產物佔用 10GB+ | 清理空間或掛載大分區 |
make CONF=linux-x86_64-normal-server-slowdebug 增量構建make bundle 生成 jdk-8u60-linux-x64.tar.gz--openjdk-target=arm-linux-gnueabihf 針對 ARM 平台通過本文步驟,你已在 Ubuntu 16.04 成功編譯 OpenJDK 8。建議保留構建目錄,後續可嘗試修改 GC 算法、添加 JVMTI 接口等定製化開發。編譯 JDK 不僅是技能,更是通往 JVM 核心世界的入場券。