Ubuntu 22.04 安装 Apache Commons Imaging 指南
实测 Ubuntu 22.04 安装 JDK 17 与 Maven,经 Maven 坐标与官方 bin 包引入 Commons Imaging 1.0.0-alpha6,完成读 EXIF/DPI、格式互转与缩略图,含选型、FAQ 与卸载。
Ubuntu 22.04 安装 Apache Commons Imaging 指南
目标:在 Ubuntu 22.04 上从零搭建 Apache Commons Imaging 1.0.0-alpha6 可用环境(JDK 17 + Maven),经 Maven 坐标与官方 bin 包两条路径引入依赖并真实编译运行读图程序,已在 Ubuntu 22.04.5 LTS 实测通过。
一、环境信息
本节列出本次实测环境的关键信息,后续所有命令与回显均来自该环境。
| 项目 | 实测值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(x86_64) |
| JDK | OpenJDK 17.0.20.1(openjdk-17-jdk) |
| Maven | Apache Maven 3.6.3 |
| Python | 3.10 + Pillow 9.0.1(用于生成测试图片) |
| 组件版本 | commons-imaging 1.0.0-alpha6 |
| 工作目录 | /opt/imaging-lab |
💡 说明:Apache Commons Imaging 是纯 Java 实现的图像处理库,本身不提供独立服务进程,安装的本质是「JDK + 构建工具 + 依赖坐标」三者就绪。本文以 /opt/imaging-lab 为实验目录,读者可替换为任意自有目录。
二、前置条件
本节说明安装前需要满足的软硬件条件。
- 一台可联网的 Ubuntu 22.04 服务器,root 权限(本文所有命令均以 root 执行)。
- 可访问 downloads.apache.org、repo1.maven.org 官方源(安装过程中实测均直连可达)。
- 若需本地生成测试图片,建议安装 Python3 与 Pillow(
apt install -y python3-pil),也可跳过直接用网络图片。
验证系统版本:
cat /etc/os-release | head -3
输出节选(实测):
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
三、版本选型说明
本节对比 commons-imaging 可用版本并给出选型建议。
| 版本 | 发布时间 | 说明 | 建议 |
|---|---|---|---|
| 1.0.0-alpha6 | 2025-04-30 | 当前最新,downloads.apache.org 与 Maven Central 同步 | 推荐(本文实测) |
| 1.0.0-alpha5 | 2024-05-21 | 上一版 alpha | 有兼容需求时可用 |
| 1.0.0-alpha4 | 2022-08-11 | 早期 alpha | 不推荐 |
| 1.0-alpha1 ~ alpha3 | 2020-2021 | 里程碑测试版 | 仅历史研究 |
⚠️ 注意:commons-imaging 至今仍处于 1.0.0-alpha 阶段(命名空间 org.apache.commons:commons-imaging,非旧版 commons-imaging 2.x 系列),API 可能随版本微调。生产引入前建议锁定具体版本号,并以上游 RELEASE-NOTES 为准。
选型建议:无历史包袱的新项目直接采用 1.0.0-alpha6;项目已锁定旧 alpha 版本时,先对照 RELEASE-NOTES 确认 API 变更再升级。本文全部命令与回显基于 1.0.0-alpha6。
四、在线安装方案 A:Maven 坐标引入(推荐)
本节通过 apt 安装 JDK 17 与 Maven,再用 Maven 坐标引入 commons-imaging,是 Java 库类组件最标准的使用方式。
4.1 方案说明
Apache Commons Imaging 是一个纯 Java 图像处理库(读图元数据、格式转换、EXIF 读写等)。它没有独立安装包与守护进程,使用方式是在 Maven 项目中声明依赖坐标,由 Maven 自动从中央仓库拉取 jar 与传递依赖。
💡 技术拓展:Java 生态的图像处理库不止 Commons Imaging 一家,常见选择对比——
库 原理/特点 适用场景 Commons Imaging 纯 Java 自研解码器,读元数据(EXIF/IPTC/XMP)强,零依赖 native 库 元数据解析、格式识别、跨平台 ImageIO(JDK 内置) 基于插件 SPI,读写 JPEG/PNG/GIF/BMP 等,写 JPEG 成熟 常规编解码、缩略图 JAI(Java Advanced Imaging) 高性能图像处理算子,已基本停止维护 历史遗留项目 Thumbnailator 封装 ImageIO 的缩略图专用库,API 极简 快速生成缩略图 本文采用 Commons Imaging 1.0.0-alpha6,理由:EXIF/DPI 元数据解析能力突出且纯 Java 无 native 依赖;写 JPEG 等受限场景可与 ImageIO 配合使用(见《快速入门与集成示例》篇)。
4.2 安装 JDK 17 与 Maven
先更新软件源,再安装 openjdk-17-jdk 与 maven:
apt-get update
apt-get install -y openjdk-17-jdk maven
输出节选(实测,已安装时提示保持最新):
maven is already the newest version (3.6.3-5).
openjdk-17-jdk is already the newest version (17.0.20.1+1-1~22.04).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
验证 JDK 与 Maven 版本:
java -version
mvn -version
输出节选(实测):
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
⚠️ 注意:若服务器预装的 Maven 运行在旧 JDK 上,需把 JAVA_HOME 指向 JDK 17(如
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64)后再执行 mvn,否则编译 Java 17 代码会报 invalid target release(见「九、常见问题」Q2)。
4.3 创建 Maven 项目并引入依赖
创建项目骨架与 pom.xml:
mkdir -p /opt/imaging-lab/maven/src/main/java
编辑 /opt/imaging-lab/maven/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>com.example</groupId>
<artifactId>imaging-lab</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>1.0.0-alpha6</version>
</dependency>
</dependencies>
</project>
配置逐项说明:
<maven.compiler.source>与<maven.compiler.target>:指定源码与目标字节码版本为 Java 17,与 JDK 17 匹配。<maven-compiler-plugin 3.11.0>:显式指定编译器插件版本。Ubuntu 自带 Maven 3.6.3 默认插件较旧,不加此行在部分环境会出现 invalid target release: 17(实测在 CentOS 8 的 Maven 3.5.4 上必现,见《CentOS 8 安装》篇 FAQ)。<dependency>org.apache.commons:commons-imaging:1.0.0-alpha6</dependency>:组件坐标,Maven 会自动下载主 jar 及传递依赖 commons-io 2.19.0、commons-lang3 3.17.0。
编译一次触发依赖下载与编译:
cd /opt/imaging-lab/maven && mvn clean compile
输出节选(实测):
[INFO] --- maven-compiler-plugin:3.11.0:compile (default-compile) @ imaging-lab ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug target 17] to target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.866 s
验证依赖已解析(实测传递依赖树):
mvn dependency:tree
输出节选(实测):
[INFO] \- org.apache.commons:commons-imaging:jar:1.0.0-alpha6:compile
[INFO] +- commons-io:commons-io:jar:2.19.0:compile
[INFO] \- org.apache.commons:commons-lang3:jar:3.17.0:compile
[INFO] BUILD SUCCESS
4.4 生成测试图片
用 Python3 + Pillow 生成一张 800x600、300DPI 的 PNG 与一张带 EXIF 的 JPEG,供后续验证:
python3 - <<'EOF'
from PIL import Image, ImageDraw, ImageFont
img = Image.new("RGB", (800, 600))
for y in range(600):
for x in range(800):
img.putpixel((x, y), (int(x/800*255), int(y/600*255), 128))
d = ImageDraw.Draw(img)
d.rectangle([50, 50, 250, 150], outline=(255, 255, 255), width=3)
d.text((60, 90), "Commons Imaging", fill=(255, 255, 255))
img.save("/opt/imaging-lab/test.png", dpi=(300, 300))
exif = Image.Exif()
exif[271] = "TestCamera Inc"
exif[272] = "TC-9000"
exif[306] = "2026:10:14 10:30:00"
img2 = Image.new("RGB", (640, 480), (30, 90, 200))
img2.save("/opt/imaging-lab/test.jpg", quality=92, dpi=(300, 300), exif=exif)
print("test.png / test.jpg generated")
EOF
输出(实测):
test.png / test.jpg generated
验证生成结果:
ls -l /opt/imaging-lab/test.png /opt/imaging-lab/test.jpg
输出(实测):
-rw-r--r-- 1 root root 3931 Oct 13 17:59 /opt/imaging-lab/test.png
-rw-r--r-- 1 root root 15976 Oct 13 17:59 /opt/imaging-lab/test.jpg
4.5 编写最小验证代码并编译运行
新建 /opt/imaging-lab/maven/src/main/java/HelloImaging.java,读取图片格式与元数据:
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImageInfo;
import org.apache.commons.imaging.ImageFormat;
import java.io.File;
public class HelloImaging {
public static void main(String[] args) throws Exception {
File img = new File(args[0]);
ImageFormat fmt = Imaging.guessFormat(img);
ImageInfo info = Imaging.getImageInfo(img);
System.out.println("Hello Apache Commons Imaging 1.0.0-alpha6");
System.out.println(" file : " + args[0]);
System.out.println(" guessFormat : " + fmt.getName());
System.out.println(" formatName : " + info.getFormatName());
System.out.println(" size : " + info.getWidth() + " x " + info.getHeight() + " px");
System.out.println(" bitsPerPixel: " + info.getBitsPerPixel());
System.out.println(" physicalDpi : " + info.getPhysicalWidthDpi() + " x " + info.getPhysicalHeightDpi() + " dpi");
}
}
编译并生成运行 classpath:
cd /opt/imaging-lab/maven
mvn -q compile
mvn -q dependency:build-classpath -Dmdep.outputFile=cp.txt
java -Xmx256m -cp "target/classes:$(cat cp.txt)" HelloImaging /opt/imaging-lab/test.png
输出(实测):
Hello Apache Commons Imaging 1.0.0-alpha6
file : /opt/imaging-lab/test.png
guessFormat : PNG
formatName : PNG Portable Network Graphics
size : 800 x 600 px
bitsPerPixel: 24
physicalDpi : 300 x 300 dpi
💡 说明:
-Xmx256m将 JVM 堆上限限制为 256MB(256-512MB 区间),图片处理类程序内存峰值低,无需大堆;dependency:build-classpath生成含传递依赖的完整 classpath(本例为 commons-imaging + commons-io + commons-lang3 三个 jar),避免 NoClassDefFoundError。
4.6 验证结果
方案 A 安装成功判据(均已实测通过):
mvn dependency:tree显示 commons-imaging 1.0.0-alpha6 解析成功;HelloImaging程序真实打印出 PNG、800x600、24 位、300 DPI 元数据。
五、离线 bin 包方案 B:官方发布包直用
本节下载 Apache 官方 bin 发布包,不经过 Maven 直接 javac/java 编译运行,适合内网离线或最小依赖场景。
5.1 方案说明
官方发布目录(downloads.apache.org/commons/imaging/binaries/)提供 bin tar.gz 与 zip 两种打包,内含主 jar、javadoc、sources、tests 与 README/RELEASE-NOTES。该方案不依赖 Maven,但需手动补齐运行时依赖(commons-io、commons-lang3)。
5.2 下载官方 bin 包并校验 sha512
mkdir -p /opt/imaging-lab/bin && cd /opt/imaging-lab/bin
wget https://downloads.apache.org/commons/imaging/binaries/commons-imaging-1.0.0-alpha6-bin.tar.gz
wget https://downloads.apache.org/commons/imaging/binaries/commons-imaging-1.0.0-alpha6-bin.tar.gz.sha512
校验完整性(实测):
cat commons-imaging-1.0.0-alpha6-bin.tar.gz.sha512
(echo "$(awk '{print $1}' commons-imaging-1.0.0-alpha6-bin.tar.gz.sha512) commons-imaging-1.0.0-alpha6-bin.tar.gz" | sha512sum -c -)
输出(实测):
820e694cba60e4b1fc8770bed935fd56125565a3a9e1bd5ac38c2ec461eaf621fb14faedb446d3b59e2c85143b8e6903eabc4e5f1f62cae292640bd4f627f234
commons-imaging-1.0.0-alpha6-bin.tar.gz: OK
5.3 解压并准备依赖 jar
cd /opt/imaging-lab/bin && tar xzf commons-imaging-1.0.0-alpha6-bin.tar.gz
ls -l commons-imaging-1.0.0-alpha6/
输出节选(实测):
total 84380
-rw-r--r-- 1 root root 7062 Apr 27 2025 CONTRIBUTING.md
-rw-r--r-- 1 root root 14099 Apr 27 2025 LICENSE.txt
-rw-r--r-- 1 root root 34995 Apr 27 2025 RELEASE-NOTES.txt
-rw-r--r-- 1 root root 863102 Apr 27 2025 commons-imaging-1.0.0-alpha6.jar
-rw-r--r-- 1 root root 691968 Apr 27 2025 commons-imaging-1.0.0-alpha6-sources.jar
-rw-r--r-- 1 root root 40697855 Apr 27 2025 commons-imaging-1.0.0-alpha6-tests.jar
从 Maven Central 手动补齐两个运行时依赖 jar:
cd /opt/imaging-lab/bin/commons-imaging-1.0.0-alpha6
wget -q https://repo1.maven.org/maven2/commons-io/commons-io/2.19.0/commons-io-2.19.0.jar
wget -q https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar
💡 说明:commons-imaging 1.0.0-alpha6 的传递依赖为 commons-io 2.19.0 与 commons-lang3 3.17.0(经 mvn dependency:tree 实测确认),bin 包不内嵌这两个 jar,直用模式必须手动准备。
5.4 编译运行验证
复制 4.5 的 HelloImaging.java 到 bin 目录并直接 javac/java:
cd /opt/imaging-lab/bin
CP="commons-imaging-1.0.0-alpha6/commons-imaging-1.0.0-alpha6.jar:commons-imaging-1.0.0-alpha6/commons-io-2.19.0.jar:commons-imaging-1.0.0-alpha6/commons-lang3-3.17.0.jar"
javac -cp "$CP" HelloImaging.java
java -Xmx256m -cp ".:$CP" HelloImaging /opt/imaging-lab/test.png
输出(实测):
Hello Apache Commons Imaging 1.0.0-alpha6
file : /opt/imaging-lab/test.png
guessFormat : PNG
formatName : PNG Portable Network Graphics
size : 800 x 600 px
bitsPerPixel: 24
physicalDpi : 300 x 300 dpi
验证命令与方案 A 一致,主 jar 直接可用,证明 bin 包方案安装成功。
六、方案对比与选择建议
| 对比维度 | 方案 A:Maven 坐标 | 方案 B:官方 bin 包 |
|---|---|---|
| 是否需联网 | 需访问 repo1.maven.org | 下载一次后完全离线可用 |
| 依赖管理 | 自动解析传递依赖 | 需手动补齐 commons-io / commons-lang3 |
| 与构建体系集成 | 与业务项目统一 | 独立目录,适合脚本/javac 直用 |
| 版本切换 | 改 pom 中 version 即可 | 下载多版本目录并存 |
| 升级维护 | Maven 自动 | 手动替换 jar |
| 适用场景 | 常规开发与生产集成(推荐) | 内网离线环境、最小依赖演示 |
选择建议:绝大多数场景用方案 A;纯内网或离线部署选方案 B;两者混用也完全可行(同一 jar 可同时被 Maven 与 javac 使用)。
七、多版本管理与升级
commons-imaging 无「多实例安装」概念,多版本管理即依赖版本管理:
- Maven 模式:修改 pom.xml 中
<version>(如 1.0.0-alpha6 改为 1.0.0-alpha5),执行mvn clean compile后即完成切换;本地仓库 /root/.m2/repository/org/apache/commons/commons-imaging/ 下会保留各版本目录。 - bin 包模式:不同版本解压到独立目录(如 commons-imaging-1.0.0-alpha5/ 与 commons-imaging-1.0.0-alpha6/ 并存),javac/java 的 classpath 指向目标版本目录即可。
- 升级前必读官方 RELEASE-NOTES.txt(bin 包内含),关注 API 变更与废弃项。
验证当前生效版本:
mvn -q help:evaluate -Dexpression=project.version -DforceStdout
java -cp "/opt/imaging-lab/bin/commons-imaging-1.0.0-alpha6/commons-imaging-1.0.0-alpha6.jar" -version
八、配置说明(JVM 内存)
Java 库类组件无常驻服务,JVM 参数在每次 java 运行时指定。图片处理任务内存建议值:
| 参数 | 建议值 | 说明 |
|---|---|---|
| -Xms | 256m | 初始堆,图片批处理可预热避免抖动 |
| -Xmx | 256m ~ 512m | 堆上限,实测 800x600 图解析仅需数十 MB |
| -XX:+UseG1GC | 默认 | 大图解码多用 G1,吞吐与延迟均衡 |
实测验证生效堆(以方案 A 运行程序时追加打印 JVM 信息):
java -Xms256m -Xmx256m -XX:+PrintCommandLineFlags -cp "target/classes:$(cat cp.txt)" HelloImaging /opt/imaging-lab/test.png 2>&1 | grep -E "MaxHeapSize|Hello"
输出节选(实测):
-XX:MaxHeapSize=268435456
Hello Apache Commons Imaging 1.0.0-alpha6
268435456 字节 = 256MB,证明 -Xmx256m 真实生效。
九、常见问题(FAQ)
Q1:下载慢或失败怎么办?
官方源 downloads.apache.org / repo1.maven.org 直连可达时正常;若网络受限,改用国内镜像或提前下载 bin 包离线分发(方案 B)。下载后务必执行 sha512 校验(见 5.2)。
Q2:Maven 编译报 invalid target release: 17?
原因:Maven 运行在 JDK 8 上,或编译器插件过旧。解法:export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 后重试,并在 pom 中显式声明 maven-compiler-plugin 3.11.0(见 4.3)。实测 CentOS 8 的 Maven 3.5.4 不加插件版本声明必现此错。
Q3:运行报 NoClassDefFoundError: org/apache/commons/io/build/AbstractOrigin?
原因:classpath 缺 commons-io 传递依赖。解法:Maven 模式用 mvn dependency:build-classpath -Dmdep.outputFile=cp.txt 生成完整 classpath;bin 包模式手动加入 commons-io-2.19.0.jar(见 5.3)。
Q4:用 Imaging.writeImage 写 JPEG 报 This image format (Jpeg-Custom) cannot be written?
原因:1.0.0-alpha6 的 JPEG 只支持解码,未实现编码器。解法:写 JPEG 用 JDK 内置 ImageIO(ImageIO.write(bi, "jpg", file)),或转存 PNG/TIFF/BMP/GIF(详见《快速入门与集成示例》篇)。
Q5:读出的 BufferedImage 是 TYPE_CUSTOM,转格式失败?
原因:部分格式解码出的图像类型非标准 RGB。解法:写出前统一转 TYPE_INT_RGB(new BufferedImage(w, h, TYPE_INT_RGB) 后 drawImage 拷贝),实测可稳定写出 PNG/JPEG/BMP/GIF/TIFF。
十、卸载与清理
- 卸载方案 A 相关缓存(保留系统 JDK/Maven):
rm -rf /opt/imaging-lab/maven
rm -rf /root/.m2/repository/org/apache/commons/commons-imaging
- 卸载方案 B 目录:
rm -rf /opt/imaging-lab/bin
- 若需同时移除 JDK 与 Maven:
apt-get remove -y openjdk-17-jdk maven
apt-get autoremove -y
卸载后验证:
which java mvn || echo "java/mvn removed"
输出(实测):
java/mvn removed
十一、参考链接
- 官方主页:https://commons.apache.org/proper/commons-imaging/
- 官方下载目录:https://downloads.apache.org/commons/imaging/binaries/
- Maven Central 坐标页:https://repo1.maven.org/maven2/org/apache/commons/commons-imaging/
- 格式支持说明:https://commons.apache.org/proper/commons-imaging/formatsupport.html
- RELEASE-NOTES:https://downloads.apache.org/commons/imaging/RELEASE-NOTES.txt