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 无显示器绘图与多版本管理,命令回显均实测通过。
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 文件格式正确,而不是某个端口处于监听状态。
二、前置条件
- 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
- 可访问 Ubuntu 官方软件源(
apt update能正常拉取索引)。 - 可访问 Apache 官方下载站
downloads.apache.org与 Maven 中央仓库repo1.maven.org(本文实测网络直连可达)。 - 至少 2 GB 可用磁盘空间(JDK + Maven + 依赖合计约 500 MB)。
- 若需要演示文字渲染,建议安装
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.5 | Java 1.3 级别 | org.apache.xmlgraphics:xmlgraphics-commons:1.x | 极老 FOP/Batik 版本配套,不建议新用 |
| 2.x(当前主线) | 2.11 | major=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 ImageIO ImageIO 插件集 扩展 TIFF/PSD/WebP 等读入格式,API 与 ImageIO 完全兼容 只做格式扩展读取 Apache PDFBox PDF 库 直接产出 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 产出 jar | javac 产出 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 -version | 17.0.x | update-alternatives --config java 选 17 |
mvn -v 的 Java version | 17.0.20.1 | 见 7.1 节 JAVA_HOME |
mvn -q -B package | EXIT=0 | 报 invalid flag: --release → JAVA_HOME 指向了 JDK 8 |
| 运行输出 writer 实现类 | ...imageio.ImageIOPNGImageWriter | 返回 null/报错 → classpath 缺主 jar |
| 运行输出 PNG 字节数 | 14114 | 报 NoClassDefFoundError → 缺 commons-io/commons-logging |
file 识别 demo.png | PNG 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
十一、参考链接
- Apache XML Graphics Commons 官方主页:https://xmlgraphics.apache.org/commons/
- 官方 bin 下载目录:https://downloads.apache.org/xmlgraphics/commons/binaries/
- Maven 中央仓库坐标页:https://repo1.maven.org/maven2/org/apache/xmlgraphics/xmlgraphics-commons/
- 2.11 Javadoc(image.loader/image.writer/ps/java2d/util.io 包):https://xmlgraphics.apache.org/commons/javadoc/2.11/
- Apache FOP(基于本库的上层项目):https://xmlgraphics.apache.org/fop/