游乐游手机版
首页/编程语言/文章详情

Ubuntu系统编译Java程序所需依赖库详解

时间:2026-05-07 09:29
Ubuntu 编译 OpenJDK 的依赖清单与版本要点 想在 Ubuntu 上成功编译 OpenJDK,准备工作是关键。这活儿说难不难,但依赖包和版本要是没搞对,后续的编译过程就会麻烦不断。下面这份清单,帮你把通用依赖和不同版本的差异化要点都理清楚了,照着来能省不少事儿。 一、通用基础依赖 无论你

Ubuntu 编译 OpenJDK 的依赖清单与版本要点

想在 Ubuntu 上成功编译 OpenJDK,准备工作是关键。这活儿说难不难,但依赖包和版本要是没搞对,后续的编译过程就会麻烦不断。下面这份清单,帮你把通用依赖和不同版本的差异化要点都理清楚了,照着来能省不少事儿。

一、通用基础依赖

无论你编译哪个版本的 OpenJDK,下面这些基础依赖都是绕不开的。它们构成了编译的底层工具链,并支撑了 HotSpot 虚拟机、图形界面(AWT)、字体渲染和打印等核心模块。

  • 构建工具与基础编译链:build-essential、gcc、g++、make、autoconf、zip。这是编译工作的“脚手架”。
  • 字体与图形渲染:libfreetype6-dev、libfontconfig1-dev。没有它们,Ja va的字体显示会出问题。
  • 打印系统:libcups2-dev。提供打印服务的底层支持。
  • X11 相关(窗口系统、渲染、测试等):libx11-dev、libxext-dev、libxrender-dev、libxrandr-dev、libxtst-dev、libxt-dev。这一系列库负责图形界面的显示和交互。
  • 音频:libasound2-dev。让Ja va程序能“发声”。
  • 外部函数接口与兼容性:libffi-dev。用于本地接口调用。
  • 源码获取工具:OpenJDK 源码托管在 Mercurial 仓库,所以需要安装 mercurial

把这些通用依赖装齐,就为编译打下了最坚实的基础。

二、按 OpenJDK 版本的差异化要点

不同版本的 OpenJDK 对编译环境和引导JDK(Bootstrap JDK)的要求各不相同,这是最容易踩坑的地方。务必对号入座。

  • OpenJDK 7
    • Bootstrap JDK:必须使用 JDK 7 本身。用 JDK 8 来编译 JDK 7 是行不通的。
    • 构建工具:建议使用 Ant 1.9.x 版本。因为 Ant 1.10 及以上版本需要 JDK 8 支持,与 JDK 7 不兼容。
    • 其他常见依赖:gawk、m4、ca-certificates、ca-certificates-ja va 这些工具和证书包也常常需要。
  • OpenJDK 8
    • Bootstrap JDK:需要 JDK 7 作为引导。
    • 常见依赖:除了通用依赖外,要特别确保 libx11-dev、libxext-dev、libxrender-dev、libxtst-dev、libxt-dev、libcups2-dev、libfreetype6-dev、libasound2-dev 这些库已安装。
  • OpenJDK 11/12/16 等更高版本
    • Bootstrap JDK:遵循“N-1”原则。即编译 JDK 12 需要用 JDK 11 作为引导,编译 JDK 16 则需要 JDK 15,以此类推。
    • 常见依赖:在通用依赖的基础上,再次核对 libfreetype6-dev、libfontconfig1-dev、libcups2-dev、X11 系列库、libasound2-dev、libffi-dev、autoconf 是否都已就位。

这些版本差异是无数实践经验的总结,编译前仔细核对能避免大部分基础错误。

三、一键安装示例命令

为了操作方便,这里给出几条可以直接在终端执行的命令。你可以根据自己的目标版本进行选择。

  • Ubuntu 18.04/20.04/22.04(通用,适合 JDK 11+)
    • sudo apt-get update
    • sudo apt-get install -y build-essential autoconf zip libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libfontconfig1-dev libasound2-dev libffi-dev mercurial
  • 如需编译 OpenJDK 7,在上述命令安装的基础上,还需要补充:gawk m4 ant-1.9.x ca-certificates ca-certificates-ja va
  • 如需编译 OpenJDK 8,最关键的一步是确保已安装 JDK 7 作为 Bootstrap JDK。可以通过 apt 安装 openjdk-7-jdk,或者手动下载解压后正确设置 JA VA_HOME 环境变量。

四、配置与排错要点

依赖装好了,只是第一步。接下来的配置(configure)阶段才是真正的考验。这里有几个关键参数和常见错误的解决方法。

  • 使用 configure 明确依赖路径
    • FreeType 库的路径经常需要手动指定,命令示例如下:
      bash configure --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu
  • 指定 Bootstrap JDK(示例)
    • 明确告诉配置脚本引导JDK的位置:
      bash configure --with-boot-jdk=/usr/lib/jvm/ja va-11-openjdk-amd64
  • 常见报错与处理
    • “freetype not found” → 首先确认 libfreetype6-dev 已安装,然后在 configure 命令中正确设置 --with-freetype-include--with-freetype-lib 路径。
    • “fontconfig missing” → 安装 libfontconfig1-dev 包。
    • “X11/xtst/xt missing” → 分别安装对应的 libx11-devlibxtst-devlibxt-dev 等开发包。
    • “configure: error: Could not find a valid Boot JDK” → 检查是否安装了符合“N-1”原则的正确JDK版本,并通过 --with-boot-jdk 参数指定其绝对路径。
    • “Ant version too new for JDK 7” → 编译 JDK 7 时,务必使用 Ant 1.9.x 版本,不要用更新的。
    • “sanity check failed” → 这类综合性错误需要系统排查:检查 LANG 等环境变量是否设置正确(建议设为 C.UTF-8);清理旧的 JA VA_HOMECLASSPATH 设置;最后再整体确认一遍所有依赖是否安装齐全。

上面这些配置参数和排错思路,都是从多个版本的实际编译记录中提炼出来的,遇到问题不妨先从这里找找答案。

来源:https://www.yisu.com/ask/89308931.html
上一篇Ubuntu系统Java编译报错原因与解决方法 下一篇Ubuntu系统下Java编译报错找不到类的解决方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
如何在Go中安全地创建和使用time.Ticker最佳实践指南
编程语言 · 2026-07-06

如何在Go中安全地创建和使用time.Ticker最佳实践指南

在Go中,time Ticker的创建位置直接影响并发安全。最佳实践是在goroutine外创建或完全限定在单个goroutine内使用,严禁无保护跨goroutine共享。无论采用哪种方式,都必须在使用完毕后调用Stop()释放底层定时器资源,防止goroutine泄露。停止后的Ticker不应再调用Reset以避免竞态。

Go跨文件cgo结构体类型不兼容的解决方案
编程语言 · 2026-07-06

Go跨文件cgo结构体类型不兼容的解决方案

cgo为每个Go包生成独立的C命名空间,导致跨文件使用同一C结构体时类型不兼容。解决方案是在中心包中定义Go封装类型(如typePointC point_t),并将所有构造、访问和业务逻辑封装其中,其他包仅引用Go类型,避免直接暴露C类型。

Go语言有符号整数二进制补码的正确输出方法
编程语言 · 2026-07-06

Go语言有符号整数二进制补码的正确输出方法

Go语言fmt Printf的%b格式对负数输出带负号的绝对值二进制,而非底层补码位模式。需注意,通过将相同位宽的有符号整数转换为无符号类型(例如将int8转为uint8),可获取真实的二进制补码比特序列,如-5输出11111011,即其补码。

Python列表按出现顺序批量替换重复字符串
编程语言 · 2026-07-06

Python列表按出现顺序批量替换重复字符串

Python列表遍历中,使用计数器对重复字符串(如“latest png”)按出现顺序依次替换为带递增编号的新字符串(如“latest1 png”),保持原列表不变。该方法时间复杂度O(n),无需额外库,严格匹配避免误改,不修改原始列表。

Go语言中如何正确读取io.Reader避免重复与内存污染
编程语言 · 2026-07-06

Go语言中如何正确读取io.Reader避免重复与内存污染

Go开发者使用io Reader Read()手动读取HTTP响应体时,因忽略实际读取字节数n和未正确处理io EOF,导致内容重复、空字节污染等问题。必须使用buf[:n]追加有效数据,将io EOF视为正常终止信号,并检查其他错误,从而避免内存污染与panic风险。