CentOS 8 安装 Apache XML Graphics Commons 指南
在 EOL 的 CentOS 8 上从零安装 Apache XML Graphics Commons 2.11,实测复现 mirrorlist 失效并切换阿里云 centos-vault 源,安装 JDK 17 与 Maven 3.5.4,解决未设 JAVA_HOME 触发 invalid flag: --release 的关键坑,Maven 与官方 bin 包双方案均实测通过。
CentOS 8 安装 Apache XML Graphics Commons 指南
目标:在 CentOS 8 上从零搭建 Apache XML Graphics Commons 2.11 的开发与运行环境,重点处理 CentOS 8 EOL 后软件源失效(mirrorlist 解析失败)与 JDK 多版本冲突两大问题,最终跑通 PNG 编码、PostScript 生成并用
file验证产物;本文全部命令与回显均已在 CentOS 8 实测通过。
CentOS Linux 8 已于 2021-12-31 停止维护(EOL),官方镜像与 mirrorlist 服务相继下线,因此本文的安装流程分为两段:先把软件源切换到阿里云 centos-vault 归档源,再安装 JDK 17 + Maven 并引入 xmlgraphics-commons 2.11。Apache XML Graphics Commons 是纯 Java 库,提供图像写出(PNG/TIFF)、图像加载预检管线、PostScript 生成与 Base64/ASCII85 等编码流,是 FOP 打印链路的标准底座,安装的判定标准是运行验证程序后能产出格式正确的图像文件。
一、环境信息
- 操作系统:CentOS Linux 8(x86_64,
/etc/os-release的VERSION="8",centos-linux-release包版本 8.4) - 软件源:阿里云 centos-vault 归档(
https://mirrors.aliyun.com/centos-vault/8.5.2111/) - JDK:java-17-openjdk-devel 17.0.1.0.12-2.el8_5(AppStream)
- 构建工具:Apache Maven 3.5.4(Red Hat 3.5.4-5,el8 AppStream 内置)
- 组件版本: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 - 验证用工作目录:
/opt/xgc-demo(工程)、/opt/xgc-demo/output(产物)、/root/jar-run(jar 直跑)
系统确认(实时回显):
cat /etc/os-release | head -2
uname -m
NAME="CentOS Linux"
VERSION="8"
x86_64
💡 说明:XML Graphics Commons 是库而非服务,没有端口监听与常驻进程;「安装完成」以运行最小验证程序并产出真实图像文件为准。
二、前置条件
- 具有 root 权限的 CentOS 8 系统。
- 可访问
mirrors.aliyun.com(EOL 后默认源已不可用,见第三章实测)与 Maven 中央仓库repo1.maven.org。 - 至少 2 GB 可用磁盘空间。
- 系统未安装 JDK,或已知晓本机 JDK 多版本现状(el8 的
alternatives默认行为是本文关键坑,见 4.4 节)。
确认默认源现状(实时回显):
yum repolist
repo id repo name
appstream CentOS Linux 8 - AppStream
baseos CentOS Linux 8 - BaseOS
extras CentOS Linux 8 - Extras
仓库定义还在,但拉取元数据会失败——下一章先修源。
三、版本选型说明
xmlgraphics-commons 的版本谱系与选型原则在第 1 篇《Ubuntu 22.04 安装 Apache XML Graphics Commons 指南》第三章已完整实测(Maven Central 元数据 latest=release=2.11,2.x 共 12 个版本,2.11 字节码 major=52 即 Java 8 基线,官方 bin 包当前仅提供 2.11)。CentOS 8 侧没有发行版级的二进制包,选型只涉及两个问题:
- 库版本:与 Ubuntu 完全一致,采用
org.apache.xmlgraphics:xmlgraphics-commons:2.11。 - JDK 版本:el8.5 AppStream 实测可用的 openjdk-devel 有三档:
yum list available "java-*-openjdk-devel" | grep -E "^java"
Available Packages
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.312.b07-2.el8_5 appstream
java-11-openjdk-devel.x86_64 1:11.0.13.0.8-4.el8_5 appstream
java-17-openjdk-devel.x86_64 1:17.0.1.0.12-2.el8_5 appstream
本文采用 java-17-openjdk-devel 17.0.1:xmlgraphics-commons 2.11 是 Java 8 字节码,JDK 8 理论上也能运行,但 2.11 配套生态(FOP 2.x 等)与本文示例均按较新 JDK 编写,且 JDK 17 的 javac 支持 --release 语义,能避开老编译器的一类报错(见 4.4 节实测)。
四、方案 A:Maven 依赖安装(在线,推荐)
4.1 方案说明
链路是:修复软件源(阿里云 vault)→ 安装 JDK 17 与 Maven → 显式设置 JAVA_HOME → pom 声明依赖 → 编译运行验证程序。与 Ubuntu 的最大差别有两点:源要手工换到归档镜像;JAVA_HOME 必须显式设置,否则 Maven 会跑到 JDK 8 上。
4.2 修复软件源:mirrorlist 失效实测与切换
先复现默认源故障。直接拉取元数据:
yum makecache
Errors during downloading metadata for repository 'appstream':
- Curl error (6): Couldn't resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=... [Could not resolve host: mirrorlist.centos.org]
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: Curl error (6): Couldn't resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=...
定位:mirrorlist.centos.org 服务已随 EOL 下线(DNS 无法解析;部分网络环境下该域表现为 403,本质相同)。修复思路是把 mirrorlist= 行注释掉,改用固定的归档 baseurl。阿里云 vault 可用版本实测(本机 centos-linux-release 为 8.4,vault 归档最高到 8.5.2111,因此直接写死 8.5.2111):
curl -s --max-time 20 https://mirrors.aliyun.com/centos-vault/ | grep -oE "8\.[0-9.]+/" | sort -uV | tail -6
8.1.1911/
8.2.2004/
8.3.2011/
8.4.2105/
8.5.2111/
8.2003/
执行切换(对 /etc/yum.repos.d/CentOS-*.repo 全部生效):
sed -i -e 's|mirrorlist=|#mirrorlist=|g' \
-e 's|#baseurl=http://mirror.centos.org/$contentdir/$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111|g' \
/etc/yum.repos.d/CentOS-*.repo
grep -m1 baseurl /etc/yum.repos.d/CentOS-Linux-AppStream.repo
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/$basearch/os/
再次拉取元数据验证:
yum makecache
CentOS Linux 8 - BaseOS 365 kB/s | 4.6 MB 00:12
CentOS Linux 8 - Extras 13 kB/s | 10 kB 00:00
Metadata cache created.
验证点:Metadata cache created. 出现即源修复完成,AppStream/BaseOS/Extras 三个仓库均可正常拉取。
4.3 安装 JDK 17 与 Maven
yum install -y java-17-openjdk-devel maven
# 输出节选(实测末尾)
xorg-x11-fonts-Type1-7.5-19.el8.noarch
Complete!
安装后查看 JVM 目录与 alternatives 现状:
ls /usr/lib/jvm/ | grep java-17
alternatives --list | grep -E "^java"
java-17
java-17-openjdk
java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
java_sdk_1.8.0_openjdk auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64
java_sdk_17 auto /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
java auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre/bin/java
关键发现:java 这个 alternatives 入口默认指向 JDK 8(1.8.0_312,其注册优先级高于 17)。此时 JAVA_HOME 为空、mvn -v 显示 Maven 运行在 1.8.0_312 上(实测回显):
echo "JAVA_HOME=[$JAVA_HOME]"
mvn -v | head -3
JAVA_HOME=[]
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre
4.4 关键坑:未设 JAVA_HOME 编译失败(实测复现)
创建工程(pom 与源码内容与第 1 篇 4.3 节完全相同,此处不再重复贴出;工程路径 /opt/xgc-demo):
mkdir -p /opt/xgc-demo/src/main/java/demo
# 写入 /opt/xgc-demo/pom.xml 与 /opt/xgc-demo/src/main/java/demo/XgcDemo.java
# (内容见第 1 篇《Ubuntu 22.04 安装 Apache XML Graphics Commons 指南》4.3 节)
cd /opt/xgc-demo
不设置 JAVA_HOME 直接编译,实测失败:
mvn -B compile 2>&1 | grep -E "ERROR|invalid|Compiling"
javac -version; java -version 2>&1 | head -1
[INFO] Compiling 1 source file with javac [debug release 17] to target/classes
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project xgc-demo: Fatal error compiling: invalid flag: --release -> [Help 1]
javac 1.8.0_312
openjdk version "1.8.0_312"
定位:pom 里的 maven.compiler.release=17 需要 javac --release 支持(JDK 9+),而 Maven 实际调用的是 alternatives 默认的 JDK 8 javac,不认识 --release,于是报 invalid flag: --release。修复:显式导出 JAVA_HOME 指向 17:
export JAVA_HOME=/usr/lib/jvm/java-17
export PATH=$JAVA_HOME/bin:$PATH
mvn -v | head -3
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 17.0.1, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
JAVA_HOME 持久化的推荐做法(写入 profile 脚本,所有登录会话生效):
cat > /etc/profile.d/java17.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-17
export PATH=$JAVA_HOME/bin:$PATH
EOF
4.5 编译、运行与产物验证
mvn -q -B package
echo "EXIT=$?"
ls -l target/*.jar | awk '{print $5, $9}'
EXIT=0
9725 target/xgc-demo-1.0.0.jar
运行验证程序(classpath 拼本地仓库三件套):
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 字节数=14007
file 验证产物:
file output/demo.png
output/demo.png: PNG image data, 320 x 200, 8-bit/color RGBA, non-interlaced
验证点:EXIT=0、PNG 字节数 14007(与 Ubuntu 的 14114 略有差异属正常,文字渲染所用的物理字体不同)、file 能识别 PNG 且尺寸一致。headless 组在 CentOS 上同样可用(实测 getAvailableFontFamilyNames() 返回 11 个字体族,含 Bitstream Charter、Cantarell、Courier 10 Pitch 等 el8 自带字体)。
五、方案 B:官方 bin 包 + jar 直跑(离线友好)
5.1 下载与校验
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:24 xmlgraphics-commons-2.11-bin.tar.gz
期望: 8ebf305f9a435fb6fbde73dc831cd7a220653ec3b7be0147c054f1aebae65b5a97076810dcdfd45351c005be4014913f74e6235ccdb2d8e6b61dc311e7dc06f2 xmlgraphics-commons-2.11-bin.tar.gz
实测: 8ebf305f9a435fb6fbde73dc831cd7a220653ec3b7be0147c054f1aebae65b5a97076810dcdfd45351c005be4014913f74e6235ccdb2d8e6b61dc311e7dc06f2
5.2 解压与 jar 直跑
bin 包结构与第 1 篇 5.3 节一致(build/ 放主 jar,lib/ 自带 commons-io 与 commons-logging)。解压并编译:
tar xzf xmlgraphics-commons-2.11-bin.tar.gz
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
== PostScript 输出(PSGenerator) ==
formatDouble(72.0/300) = 0.24
已写入 /opt/xgc-demo/output/demo.ps 字节数=451
⚠️ 注意:若当前会话忘了设置
JAVA_HOME,上面javac会落到 JDK 8 上,实测报javac: directory not found: out——JDK 8 的 javac 不自动创建-d指定的输出目录(JDK 9+ 会自动创建),且后续编译示例代码还会因 JDK 9+ 的 API 而报错。务必先执行 4.4 节的两行 export。
file 验证 PS 产物:
file /opt/xgc-demo/output/demo.ps
/opt/xgc-demo/output/demo.ps: PostScript document text conforming DSC level 3.0
六、方案对比与选择建议
| 维度 | 方案 A:Maven 依赖 | 方案 B:官方 bin 包 + jar 直跑 |
|---|---|---|
| 软件源依赖 | 需先修复 EOL 源(4.2 节) | 仅需能访问 downloads.apache.org |
| 依赖管理 | pom 统一管控,传递依赖自动 | lib/ 自带三件套,手工拼 classpath |
| JDK 要求 | 必须显式 JAVA_HOME(否则 JDK 8 报错) | 同样必须显式 JAVA_HOME(javac 行为差异) |
| 适用场景 | el8 上的常规工程开发 | 源修复困难的内网/离线服务器 |
选型建议:两方案在 CentOS 8 上都依赖「显式 JAVA_HOME」这一前提;源已修复则优先方案 A,长期离线环境用方案 B 并把 bin 包纳入本地制品管理。
七、基础配置说明
7.1 JAVA_HOME(el8 必配)
el8 的 alternatives 默认 java 指向 JDK 8(4.3 节实测),因此 el8 必须显式设置 JAVA_HOME=/usr/lib/jvm/java-17,并建议通过 /etc/profile.d/java17.sh 持久化。/usr/lib/jvm/java-17 是安装包提供的稳定软链,指向具体小版本目录 java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64,后续 yum 升级小版本无需改配置。
7.2 headless 与字体
服务器无图形界面,运行验证程序统一加 -Djava.awt.headless=true(本机 DISPLAY 为空时 JVM 也会自动判定,但显式声明更稳)。el8 基础环境自带 Bitstream Charter、Cantarell 等字体(实测可用字体族 11 个),drawString 直接可用;如需 DejaVu 系字体可另装 dejavu-fonts-common/dejavu-sans-fonts。
7.3 代码级「参数」
写出分辨率(ImageWriterParams.setResolution)、TIFF 压缩算法(setCompressionMethod)、ImageContext 源分辨率等均通过 API 入参控制,无外部配置文件;完整实测行为见第 4 篇《Apache XML Graphics Commons 2.11 图像编解码与 IO API 详解》。
八、验证清单
| 检查项 | 预期(实测值) | 不符时排查 |
|---|---|---|
yum makecache | Metadata cache created. | 报 resolve mirrorlist.centos.org 失败 → 4.2 节换源 |
yum list java-17-openjdk-devel | 17.0.1.0.12-2.el8_5 | 源未指到 8.5.2111 归档 → 4.2 节 |
mvn -v 的 Java version | 17.0.1(不是 1.8.0_312) | 未 export JAVA_HOME → 4.4 节 |
mvn -q -B package | EXIT=0 | 报 invalid flag: --release → 4.4 节 |
| 运行输出 PNG 字节数 | 14007 | 报 NoClassDefFoundError → classpath 缺依赖 jar |
file 识别产物 | PNG image data, 320 x 200, 8-bit/color RGBA | 输出为空 → 检查输出流 close |
九、常见问题(FAQ)
Q1:yum makecache 报 Couldn't resolve host: mirrorlist.centos.org(或 HTTP 403)怎么办?
CentOS 8 EOL 后 mirrorlist 服务已下线,属预期现象。按 4.2 节把 repo 文件的 mirrorlist= 注释掉、启用指向 https://mirrors.aliyun.com/centos-vault/8.5.2111/ 的 baseurl= 即可;vault 归档里 el8 最高版本是 8.5.2111,不要再写 $releasever(本机为 8.4,归档中无此目录)。
Q2:编译报 Fatal error compiling: invalid flag: --release?
Maven 跑在 JDK 8 上(el8 alternatives 默认值)。执行 export JAVA_HOME=/usr/lib/jvm/java-17 && export PATH=$JAVA_HOME/bin:$PATH 后重试,并按 7.1 节持久化。用 mvn -v 的 Java version 行确认是否 17.0.1。
Q3:javac 报 directory not found: out?
当前 javac 是 JDK 8:它不会自动创建 -d 指定的输出目录(JDK 9+ 会)。先 mkdir -p out,或设置 JAVA_HOME 到 17 再编译(推荐后者,源码里用了 JDK 9+ 的 InputStream.readAllBytes 等方法时 JDK 8 无法编译)。
Q4:运行时报 NoClassDefFoundError(commons-io 或 commons-logging)?
xmlgraphics-commons 2.11 依赖 commons-io 2.17.0 与 commons-logging 1.3.0。Maven 方案自动解析;jar 直跑方案必须把 bin 包 lib/ 下两个 jar 拼进 -cp。
Q5:生成的 PNG 字节数和 Ubuntu 机器上不一样?
正常。PNG 内的文字栅格化结果依赖机器字体(el8 实测字体族 11 个,Ubuntu 12 个),图像尺寸与格式不受影响,file 验证以 320x200 RGBA 为准。
Q6:xmlgraphics-commons 2.11 需要 JDK 17 吗?
不需要。实测其字节码主版本号为 52(Java 8),JDK 8 及以上可运行;本文用 JDK 17 是为了配合 --release 编译语义与新生态,属推荐而非硬性要求。
十、卸载与清理
移除工程与 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 /root/.m2/repository/org/apache/xmlgraphics/xmlgraphics-commons
rm -rf /root/.m2/repository/commons-io/commons-io/2.17.0
rm -rf /root/.m2/repository/commons-logging/commons-logging/1.3.0
卸载 JDK 与 Maven(先 -s 预演确认,无误后去掉 -s 执行):
yum -s remove java-17-openjdk-devel maven | tail -4
# 输出节选(预演格式)
Removing:
java-17-openjdk-devel x86_64 1:17.0.1.0.12-2.el8_5 @appstream
maven noarch 3.5.4-5.module_el8.5.0+... @appstream
yum remove -y java-17-openjdk-devel maven
如需恢复系统默认源配置(放弃归档源),重新安装 centos-linux-repos 包即可覆盖被 sed 修改的 repo 文件。
十一、参考链接
- 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/
- 阿里云 CentOS Vault 归档镜像:https://mirrors.aliyun.com/centos-vault/
- CentOS 8 EOL 说明与归档源指引:https://www.centos.org/centos-linux-eol/