Ubuntu 22.04 安装 Apache XML Graphics Commons 指南

在 Ubuntu 22.04 上从零安装 Apache XML Graphics Commons 2.11,覆盖 JDK 17 与 Maven 环境、Maven 坐标与官方 bin 包两种方案、PNG/TIFF/PostScript 产物落盘验证、headless 无显示器绘图与多版本管理,命令回显均实测通过。

Apache XML Graphics CommonsApache XML Graphics Commons2026/10/15

Ubuntu 22.04 安装 Apache XML Graphics Commons 指南

目标:在 Ubuntu 22.04 上从零搭建 Apache XML Graphics Commons 2.11 的开发与运行环境(JDK 17 + Maven 3.6.3),跑通 PNG/TIFF 图像编码、ImageInfo 预检、PostScript 生成与 Base64 编解码等核心能力,并给出官方 bin 包离线方案与多版本管理方法;本文全部命令与回显均已在 Ubuntu 22.04 实测通过。

Apache XML Graphics Commons 是 Apache XML Graphics 项目下的 Java 基础图形库,为 Apache FOP、Batik 等上层项目提供图像加载管线(org.apache.xmlgraphics.image.loader)、图像写出器(org.apache.xmlgraphics.image.writer)、PostScript 生成(org.apache.xmlgraphics.ps)与 IO 编码流(org.apache.xmlgraphics.util.io)等公共能力。它是纯 Java 库,没有独立进程与常驻服务,安装的本质就是「装好 JDK/构建工具 → 引入依赖 → 写最小验证代码 → 编译运行并验证产物」。本文给出两种落地方式:面向开发的 Maven 依赖方案,以及面向无构建体系场景的官方 bin 包 + jar 直跑方案。

一、环境信息

本节先固定可复现的基线环境,后续所有命令均在此环境执行。

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • JDK:OpenJDK 17.0.20.1(apt 包 openjdk-17-jdk)
  • 构建工具:Apache Maven 3.6.3
  • 组件版本:xmlgraphics-commons 2.11(Maven Central 当前 latest/release)
  • 传递依赖:commons-io 2.17.0、commons-logging 1.3.0(均为编译期依赖)
  • Maven 坐标:org.apache.xmlgraphics:xmlgraphics-commons:2.11
  • 官方下载目录:https://downloads.apache.org/xmlgraphics/commons/binaries/
  • 验证用工作目录:/opt/xgc-demo(工程)、/opt/xgc-demo/output(图像产物)、/root/jar-run(jar 直跑)

系统与架构确认(实时回显):

cat /etc/os-release | head -3
uname -m
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
x86_64

💡 说明:XML Graphics Commons 是库而非服务,环境中不存在需要常驻的守护进程;「安装完成」的判定标准是能编译并运行一个调用其 API 的最小程序,并用 file 命令确认生成的图像/PostScript 文件格式正确,而不是某个端口处于监听状态。

二、前置条件

  1. 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
  2. 可访问 Ubuntu 官方软件源(apt update 能正常拉取索引)。
  3. 可访问 Apache 官方下载站 downloads.apache.org 与 Maven 中央仓库 repo1.maven.org(本文实测网络直连可达)。
  4. 至少 2 GB 可用磁盘空间(JDK + Maven + 依赖合计约 500 MB)。
  5. 若需要演示文字渲染,建议安装 fontconfig 与 fonts-dejavu-core(见 7.3 节实测:缺失时也能出图,但字体族不全)。

网络连通性确认(实时回显):

curl -sI --max-time 20 https://downloads.apache.org/ | head -1
HTTP/1.1 200 OK
curl -sI --max-time 20 https://repo1.maven.org/maven2/org/apache/xmlgraphics/xmlgraphics-commons/ | head -1
HTTP/1.1 200 OK

三、版本选型说明

本节给出 xmlgraphics-commons 的版本谱系,帮助读者在 1.x 与 2.x 之间做出选择。Maven 中央仓库元数据(https://repo1.maven.org/maven2/org/apache/xmlgraphics/xmlgraphics-commons/maven-metadata.xml)实测内容:

<latest>2.11</latest>
<release>2.11</release>
<versions>
  1.1, 1.2, 1.3, 1.3.1, 1.4, 1.5,
  2.0, 2.0.1, 2.1, 2.2, 2.3, 2.4,
  2.6, 2.7, 2.8, 2.9, 2.10, 2.11
</versions>
<lastUpdated>20250506084302</lastUpdated>
版本线最新版JDK 基线(字节码实测)坐标适用场景
1.x(已停止维护)1.5Java 1.3 级别org.apache.xmlgraphics:xmlgraphics-commons:1.x极老 FOP/Batik 版本配套,不建议新用
2.x(当前主线)2.11major=52(Java 8)org.apache.xmlgraphics:xmlgraphics-commons:2.x所有新项目默认选择

用 javap 实测 2.11 的字节码主版本号为 52(即 Java 8),因此 JDK 8 及以上均可运行;本文采用 JDK 17 作为运行与构建环境。2.11 于 2025-05-06 发布,jar 大小 686441 字节。本文实际采用 2.11,理由是它是 Maven Central 上 latest 与 release 指向的当前最新稳定版。

官方 bin 下载目录实测当前仅提供 2.11(旧版本在 archive.apache.org):

curl -s --max-time 30 https://downloads.apache.org/xmlgraphics/commons/binaries/ | grep -oE "xmlgraphics-commons-[0-9.]+\.tar\.gz" | sort -u
xmlgraphics-commons-2.11-bin.tar.gz

💡 技术拓展:Java 生态里做「图像编码/图形生成」的库不止 XML Graphics Commons 一家——

方案定位特点适用场景
javax.imageio(JDK 原生)基础 API零依赖,支持 PNG/JPEG/GIF/BMP,TIFF 需 JDK 9+简单读写、追求零依赖
Apache XML Graphics Commons图形/图像基础库PNG/TIFF 写出器、ImageManager 加载管线、PostScript 生成、Base64/ASCII85 编码流打印输出、FOP/Batik 配套、EPS/PS 场景
TwelveMonkeys ImageIOImageIO 插件集扩展 TIFF/PSD/WebP 等读入格式,API 与 ImageIO 完全兼容只做格式扩展读取
Apache PDFBoxPDF 库直接产出 PDF,而非图像/PS文档交付物是 PDF 本身

本文采用 Apache XML Graphics Commons,理由是它把「图像写出(含 TIFF 压缩参数与多帧)、图像预检管线、PostScript 文本协议生成、PS 常用编码流」整合在一个零额外传递依赖的 jar 里,是 FOP 打印链路的标准底座。

四、方案 A:Maven 依赖安装(在线,推荐)

本节面向常规 Java 项目开发,通过 apt 安装 JDK 与 Maven,再用 Maven 坐标引入 xmlgraphics-commons 依赖并跑通最小验证程序。

4.1 方案说明

方案 A 的链路是:apt 安装 openjdk-17-jdk 与 maven → 在 pom.xml 中声明 org.apache.xmlgraphics:xmlgraphics-commons:2.11 → Maven 自动下载 jar 及其两个传递依赖 → 编译并运行验证程序 → file 命令确认产物格式。优点是版本由 pom 统一管控、传递依赖自动解析;缺点是首次构建需要联网。

4.2 安装 JDK 17 与 Maven

apt-get update -qq && apt-get install -y openjdk-17-jdk maven
# 输出节选(实测首尾)
Setting up openjdk-17-jdk:amd64 (17.0.20.1+1-1~22.04) ...
Setting up maven (3.6.3-5) ...

确认版本与 Maven 实际使用的 JDK:

java -version 2>&1
mvn -v | head -3
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64

验证点:Java version 一行显示 17.0.20.1,说明 Maven 已绑定到 JDK 17,无需额外设置 JAVA_HOME。

4.3 创建工程并引入依赖

建立工程目录并写入 pom.xml 与演示源码:

mkdir -p /opt/xgc-demo/src/main/java/demo

pom.xml(完整内容,文件路径 /opt/xgc-demo/pom.xml):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>demo</groupId>
  <artifactId>xgc-demo</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.release>17</maven.compiler.release>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.apache.xmlgraphics</groupId>
      <artifactId>xmlgraphics-commons</artifactId>
      <version>2.11</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
      </plugin>
    </plugins>
  </build>
</project>

逐项说明关键配置:

  • org.apache.xmlgraphics:xmlgraphics-commons:2.11:唯一业务依赖,Maven 会自动连带下载 commons-io 2.17.0 与 commons-logging 1.3.0 两个传递依赖。
  • maven.compiler.release=17:按 JDK 17 语义编译;2.11 自身是 major=52 的 Java 8 字节码,两者互不影响。
  • maven-compiler-plugin 显式固定 3.11.0:Maven 3.6.3 默认绑定的 3.1 版插件不认识 release 属性,会退回按 1.5 编译并被 JDK 17 拒绝。
  • project.build.sourceEncoding=UTF-8:源码含中文注释时防止按 POSIX 默认编码编译报错。

演示源码 /opt/xgc-demo/src/main/java/demo/XgcDemo.java 先提供 PNG 编码主逻辑(完整源码较长,本文第五章 jar 直跑与第 4.5 节均基于同一文件,此处给出可直接落盘的最小验证版):

package demo;

import org.apache.xmlgraphics.image.writer.ImageWriter;
import org.apache.xmlgraphics.image.writer.ImageWriterParams;
import org.apache.xmlgraphics.image.writer.ImageWriterRegistry;

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class XgcDemo {
    static final String OUT = "/opt/xgc-demo/output";

    public static void main(String[] args) throws Exception {
        new File(OUT).mkdirs();
        BufferedImage img = new BufferedImage(320, 200, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();
        g2.setPaint(new GradientPaint(0, 0, new Color(30, 80, 200), 320, 200, Color.WHITE));
        g2.fillRect(0, 0, 320, 200);
        g2.setColor(new Color(220, 40, 40));
        g2.fillRect(20, 20, 120, 70);
        g2.setColor(Color.BLACK);
        g2.setFont(new Font("SansSerif", Font.BOLD, 20));
        g2.drawString("XML Graphics PNG", 30, 140);
        g2.dispose();

        ImageWriter writer = ImageWriterRegistry.getInstance().getWriterFor("image/png");
        System.out.println("writer 实现: " + writer.getClass().getName());
        System.out.println("writer MIME: " + writer.getMIMEType()
                + ", isFunctional=" + writer.isFunctional());
        ImageWriterParams params = new ImageWriterParams();
        params.setResolution(300);
        File target = new File(OUT, "demo.png");
        try (OutputStream out = new FileOutputStream(target)) {
            writer.writeImage(img, out, params);
        }
        System.out.println("已写入 " + target.getAbsolutePath()
                + " 字节数=" + target.length());
    }
}

核心 API 说明:ImageWriterRegistry.getInstance().getWriterFor("image/png") 按目标 MIME 类型从注册表取写出器(2.11 内置服务发现会加载 ImageIOPNGImageWriter);ImageWriterParams.setResolution(300) 把 300 DPI 写进 PNG 的物理分辨率块;writeImage(RenderedImage, OutputStream, ImageWriterParams) 完成编码。

4.4 编译、运行与产物验证

cd /opt/xgc-demo && mvn -q -B package
echo "EXIT=$?"
ls -l target/*.jar | awk '{print $5, $9}'
EXIT=0
9727 target/xgc-demo-1.0.0.jar

确认依赖树(两个传递依赖已自动就位):

mvn -B dependency:tree 2>&1 | grep -E "maven-dependency-plugin.*:tree|demo:xgc-demo|xmlgraphics-commons:jar|commons-io:commons-io:jar|commons-logging:commons-logging:jar"
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ xgc-demo ---
[INFO] demo:xgc-demo:jar:1.0.0
[INFO] \- org.apache.xmlgraphics:xmlgraphics-commons:jar:2.11:compile
[INFO]    +- commons-io:commons-io:jar:2.17.0:compile
[INFO]    \- commons-logging:commons-logging:jar:1.3.0:compile

运行验证程序:

CP=target/classes:/root/.m2/repository/commons-io/commons-io/2.17.0/commons-io-2.17.0.jar:/root/.m2/repository/commons-logging/commons-logging/1.3.0/commons-logging-1.3.0.jar:/root/.m2/repository/org/apache/xmlgraphics/xmlgraphics-commons/2.11/xmlgraphics-commons-2.11.jar
java -Dfile.encoding=UTF-8 -Djava.awt.headless=true -cp "$CP" demo.XgcDemo
writer 实现: org.apache.xmlgraphics.image.writer.imageio.ImageIOPNGImageWriter
writer MIME: image/png, isFunctional=true
已写入 /opt/xgc-demo/output/demo.png 字节数=14114

用 file 命令验证产物是真实 PNG(320x200、8 位 RGBA、含 300 DPI 物理信息):

file /opt/xgc-demo/output/demo.png
/opt/xgc-demo/output/demo.png:           PNG image data, 320 x 200, 8-bit/color RGBA, non-interlaced

验证点:EXIT=0、运行输出 writer 实现类、file 能识别出 PNG 且尺寸与代码一致,三项全部满足即安装成功。-Djava.awt.headless=true 显式声明无显示器运行(实测在本机无 DISPLAY 环境下不加该参数 GraphicsEnvironment.isHeadless() 也会自动判定为 true,见 7.2 节)。

五、方案 B:官方 bin 包 + jar 直跑(离线友好)

本节面向没有 Maven/构建体系的场景,直接使用 Apache 官方发布的 bin 包,用 javac + java 完成编译运行。

5.1 方案说明

链路是:从 downloads.apache.org 下载官方 bin 包 → 校验 sha512 → 解压得到 build/xmlgraphics-commons-2.11.jar 与 lib/ 下的两个依赖 jar → 用 javac -cp 编译源码 → 用 java -cp 运行。官方包自带全部运行依赖,无需 Maven。

5.2 下载与完整性校验

cd /root && curl -sO --max-time 120 https://downloads.apache.org/xmlgraphics/commons/binaries/xmlgraphics-commons-2.11-bin.tar.gz
curl -sO --max-time 60 https://downloads.apache.org/xmlgraphics/commons/binaries/xmlgraphics-commons-2.11-bin.tar.gz.sha512
ls -l xmlgraphics-commons-2.11-bin.tar.gz
echo "期望: $(cat xmlgraphics-commons-2.11-bin.tar.gz.sha512)"
echo "实测: $(sha512sum xmlgraphics-commons-2.11-bin.tar.gz | awk '{print $1}')"
-rw-r--r-- 1 root root 2009106 Oct 15 11:20 xmlgraphics-commons-2.11-bin.tar.gz
期望: 8ebf305f9a435fb6fbde73dc831cd7a220653ec3b7be0147c054f1aebae65b5a97076810dcdfd45351c005be4014913f74e6235ccdb2d8e6b61dc311e7dc06f2  xmlgraphics-commons-2.11-bin.tar.gz
实测: 8ebf305f9a435fb6fbde73dc831cd7a220653ec3b7be0147c054f1aebae65b5a97076810dcdfd45351c005be4014913f74e6235ccdb2d8e6b61dc311e7dc06f2

⚠️ 注意:.sha512 文件内容为「摘要 + 文件名」两列,比对时只取第一列摘要;若不一致,说明下载包损坏或被篡改,须删除后重新下载,切勿跳过校验直接使用。

5.3 解压与目录结构

tar xzf xmlgraphics-commons-2.11-bin.tar.gz && ls xmlgraphics-commons-2.11/
KEYS
LICENSE
NOTICE
README
build
examples
javadocs
lib
ls xmlgraphics-commons-2.11/build/ xmlgraphics-commons-2.11/lib/
xmlgraphics-commons-2.11/build/:
xmlgraphics-commons-2.11.jar

xmlgraphics-commons-2.11/lib/:
README.txt
commons-io-2.17.0.jar
commons-io.LICENSE.txt
commons-io.NOTICE.txt
commons-logging-1.3.0.jar
commons-logging.LICENSE.txt
commons-logging.NOTICE.txt

主 jar 在 build/ 下,lib/ 自带 commons-io 与 commons-logging 两个运行依赖——这正是依赖树里显示的两个 compile 依赖,官方包已替你收集齐全。examples/java 下还有官方示例源码可参考。

5.4 javac 编译与 java 运行

mkdir -p /root/jar-run/out && cd /root/jar-run
JARDIR=/root/xmlgraphics-commons-2.11
javac -encoding UTF-8 -cp $JARDIR/build/xmlgraphics-commons-2.11.jar:$JARDIR/lib/commons-io-2.17.0.jar:$JARDIR/lib/commons-logging-1.3.0.jar -d out XgcDemo.java
echo "JAVAC_EXIT=$?"
java -Dfile.encoding=UTF-8 -Djava.awt.headless=true -cp out:$JARDIR/build/xmlgraphics-commons-2.11.jar:$JARDIR/lib/commons-io-2.17.0.jar:$JARDIR/lib/commons-logging-1.3.0.jar XgcDemo
JAVAC_EXIT=0
writer 实现: org.apache.xmlgraphics.image.writer.imageio.ImageIOPNGImageWriter
writer MIME: image/png, isFunctional=true
已写入 /opt/xgc-demo/output/demo.png 字节数=14114

验证点:无 NoClassDefFoundError、正常输出 PNG,说明 bin 包三件套(主 jar + 两个依赖 jar)拼 classpath 可用。

5.5 Maven 中央仓库 jar 的独立获取(可选)

若只想从 Maven 中央仓库获取单个 jar 而不使用构建工具,可直接下载并校验 sha1:

cd /root/jar-run && curl -sO --max-time 60 https://repo1.maven.org/maven2/org/apache/xmlgraphics/xmlgraphics-commons/2.11/xmlgraphics-commons-2.11.jar
curl -sO --max-time 30 https://repo1.maven.org/maven2/org/apache/xmlgraphics/xmlgraphics-commons/2.11/xmlgraphics-commons-2.11.jar.sha1
echo "期望: $(cat xmlgraphics-commons-2.11.jar.sha1)"
echo "实测: $(sha1sum xmlgraphics-commons-2.11.jar | awk '{print $1}')"
期望: 4adc636cc7051d40f859f53287ae268684ab6a80
实测: 4adc636cc7051d40f859f53287ae268684ab6a80

中央仓库 jar 只有主 jar 本身(686441 字节),方案 B 的 classpath 必须再拼上 commons-io 2.17.0 与 commons-logging 1.3.0,缺一运行时会报 NoClassDefFoundError。

六、方案对比与选择建议

维度方案 A:Maven 依赖方案 B:官方 bin 包 + jar 直跑
运行期依赖Maven 自动解析(2 个传递依赖)官方包 lib/ 自带,或手工拼 classpath
是否联网首次构建需联网仅下载时需要联网
依赖版本管控pom 统一声明,可锁版本靠文件名区分
传递依赖更新随依赖树自动升级需更换 bin 包版本
可复现产物mvn package 产出 jarjavac 产出 class + 引用 jar
适用场景常规工程开发离线服务器、临时验证、无构建体系

选型建议:项目有构建体系(Maven/Gradle)一律选方案 A,版本与传递依赖全自动;无构建工具的老旧服务器临时验证、或要把 jar 手工嵌入既有脚本,选方案 B。两者也可共存——开发期方案 A,交付期把 bin 包三件套连同应用一起分发。

七、基础配置说明

本节说明 XML Graphics Commons 使用中真正需要设置的「配置」。它是库而非服务,没有独立配置文件,全部行为通过代码参数或 JVM 系统属性控制。

7.1 环境变量 JAVA_HOME

方案 A 下 apt 版 Maven 自带兼容逻辑,JAVA_HOME 为空也能按 PATH 中的 java 定位 JDK(实测本环境 mvn -v 已正确显示 17.0.20.1)。仅当手工安装 JDK 或系统存在多版本 JDK 时才需显式导出:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

⚠️ 注意:如果你按第 2 篇《CentOS 8 安装 Apache XML Graphics Commons 指南》在 CentOS 8 上部署,情况完全不同——el8 的 alternatives 默认 java 指向 JDK 8,不显式设置 JAVA_HOME 会导致 Maven 用 JDK 8 编译并报 invalid flag: --release,必须显式导出。

7.2 headless 模式

服务器通常没有图形界面。JVM 通过 java.awt.headless 系统属性决定 AWT 运行模式,实测本环境 DISPLAY 为空:

echo "DISPLAY=[$DISPLAY]"
java -Dfile.encoding=UTF-8 -cp "$CP" demo.XgcDemo 2>&1 | head -1
DISPLAY=[]

未显式设置该属性时,GraphicsEnvironment.isHeadless() 会依据 DISPLAY 等环境变量自动判定(本环境实测返回 true,绘图与编码全部正常)。生产脚本建议显式加 -Djava.awt.headless=true,避免依赖隐式判定;实测 java -Djava.awt.headless=true 下 PNG/TIFF/PostScript 全链路可用(回显见 4.4 节与第 3~5 篇文章)。

7.3 字体组件(drawString 文字渲染相关)

验证代码里的 g2.drawString(...) 依赖 JVM 字体设施。Ubuntu 上建议安装:

apt-get install -y fontconfig fonts-dejavu-core

实测对照:卸载这两个包后在 headless 下运行同一程序仍能成功生成 PNG(JVM 使用回退渲染,14114 字节 vs 装回后的 14114 字节量级一致);装回后 getAvailableFontFamilyNames() 实测返回 12 个字体族(DejaVu Sans、DejaVu Serif 等)。结论:最小环境可出图,但为获得完整字体族与稳定渲染质量,建议安装字体组件。

7.4 代码级「参数」

写出分辨率(ImageWriterParams.setResolution)、TIFF 压缩算法(setCompressionMethod("PackBits"/"LZW"/"Deflate"))、图像上下文分辨率(ImageContext.getSourceResolution())等均通过 API 入参控制,无外部配置文件;各参数的完整实测行为见第 4 篇《Apache XML Graphics Commons 2.11 图像编解码与 IO API 详解》。

八、验证清单

安装完成后逐项确认:

检查项预期(实测值)不符时排查
java -version17.0.xupdate-alternatives --config java 选 17
mvn -v 的 Java version17.0.20.1见 7.1 节 JAVA_HOME
mvn -q -B packageEXIT=0报 invalid flag: --release → JAVA_HOME 指向了 JDK 8
运行输出 writer 实现类...imageio.ImageIOPNGImageWriter返回 null/报错 → classpath 缺主 jar
运行输出 PNG 字节数14114报 NoClassDefFoundError → 缺 commons-io/commons-logging
file 识别 demo.pngPNG image data, 320 x 200, 8-bit/color RGBA文件为 0 字节 → 输出流未 flush/close

九、常见问题(FAQ)

Q1:运行时报 java.lang.NoClassDefFoundError: org/apache/commons/io/... 或 org/apache/commons/logging/...? xmlgraphics-commons 2.11 有两个编译期传递依赖:commons-io 2.17.0 与 commons-logging 1.3.0(依赖树实测见 4.4 节)。Maven 会自动带入;jar 直跑时必须把这两个 jar 一并拼进 -cp(官方 bin 包的 lib/ 已含)。

Q2:ImageWriterRegistry.getInstance().getWriterFor("image/png") 返回 null? 2.11 的注册表通过服务发现机制加载内置写出器实现(ImageIOPNGImageWriter、ImageIOTIFFImageWriter、ImageIOJPEGImageWriter),实测正常 classpath 下自动就位。返回 null 通常是 classpath 里混入了残缺的旧版 jar,用 mvn dependency:tree 确认只有一个 xmlgraphics-commons 版本。

Q3:drawString 输出的文字位置/字体和预期不同? 逻辑字体 SansSerif 由 JVM 映射到物理字体。最小环境(无 fontconfig)下可用字体族有限(实测也能出图,见 7.3 节),安装 fontconfig fonts-dejavu-core 后字体族从回退集扩展到 12 个。对排版敏感的场景建议显式 createFont() 加载 TTF。

Q4:没有图形界面的服务器能用吗? 能。加 -Djava.awt.headless=true 即可,实测 headless 下 PNG/TIFF/PostScript 生成与 getAvailableFontFamilyNames() 全部正常;本环境连 DISPLAY 都为空,JVM 也会自动判定 headless。XML Graphics Commons 的图像写出与 PS 生成不依赖 X11。

Q5:xmlgraphics-commons 2.11 能不能跑在 JDK 8 上? 可以。实测其字节码主版本号为 52(Java 8),JDK 8 及以上均可运行;本文用 JDK 17 属于更高基线,兼容性不受影响。

Q6:编译报 Source option 5 is no longer supported? Maven 3.6.3 默认绑定的 maven-compiler-plugin 3.1 不认识 maven.compiler.release 属性。按 4.3 节 pom 显式固定 maven-compiler-plugin 3.11.0 即可。

十、卸载与清理

XML Graphics Commons 本身不产生系统级安装,卸载即移除依赖与本地文件。

移除工程与 bin 包(清理本文创建的文件):

rm -rf /opt/xgc-demo /root/jar-run /root/xmlgraphics-commons-2.11 /root/xmlgraphics-commons-2.11-bin.tar.gz
ls /opt/xgc-demo 2>&1
ls: cannot access '/opt/xgc-demo': No such file or directory

移除 Maven 本地仓库中的相关构件(影响所有工程,慎用):

rm -rf $HOME/.m2/repository/org/apache/xmlgraphics/xmlgraphics-commons
rm -rf $HOME/.m2/repository/commons-io/commons-io/2.17.0
rm -rf $HOME/.m2/repository/commons-logging/commons-logging/1.3.0

卸载 JDK 与 Maven(仅当不再需要)。先以 -s 预演确认将删除的包,无误后去掉 -s 真正执行:

apt-get -s purge -y openjdk-17-jdk maven | tail -5
# 输出节选(实测首尾)
The following packages will be REMOVED:
  maven* openjdk-17-jdk*
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.

确认无误后真正卸载:

apt-get purge -y openjdk-17-jdk maven && apt-get autoremove -y

十一、参考链接

  1. Apache XML Graphics Commons 官方主页:https://xmlgraphics.apache.org/commons/
  2. 官方 bin 下载目录:https://downloads.apache.org/xmlgraphics/commons/binaries/
  3. Maven 中央仓库坐标页:https://repo1.maven.org/maven2/org/apache/xmlgraphics/xmlgraphics-commons/
  4. 2.11 Javadoc(image.loader/image.writer/ps/java2d/util.io 包):https://xmlgraphics.apache.org/commons/javadoc/2.11/
  5. Apache FOP(基于本库的上层项目):https://xmlgraphics.apache.org/fop/
Ubuntu 22.04 安装 Apache XML Graphics Commons 指南 - Quzuo