Ubuntu 22.04 安装 Apache Commons Imaging 指南

实测 Ubuntu 22.04 安装 JDK 17 与 Maven,经 Maven 坐标与官方 bin 包引入 Commons Imaging 1.0.0-alpha6,完成读 EXIF/DPI、格式互转与缩略图,含选型、FAQ 与卸载。

Apache Commons ImagingApache Commons Imaging2026/10/14

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)
JDKOpenJDK 17.0.20.1(openjdk-17-jdk)
MavenApache Maven 3.6.3
Python3.10 + Pillow 9.0.1(用于生成测试图片)
组件版本commons-imaging 1.0.0-alpha6
工作目录/opt/imaging-lab

💡 说明:Apache Commons Imaging 是纯 Java 实现的图像处理库,本身不提供独立服务进程,安装的本质是「JDK + 构建工具 + 依赖坐标」三者就绪。本文以 /opt/imaging-lab 为实验目录,读者可替换为任意自有目录。

二、前置条件

本节说明安装前需要满足的软硬件条件。

  1. 一台可联网的 Ubuntu 22.04 服务器,root 权限(本文所有命令均以 root 执行)。
  2. 可访问 downloads.apache.org、repo1.maven.org 官方源(安装过程中实测均直连可达)。
  3. 若需本地生成测试图片,建议安装 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-alpha62025-04-30当前最新,downloads.apache.org 与 Maven Central 同步推荐(本文实测)
1.0.0-alpha52024-05-21上一版 alpha有兼容需求时可用
1.0.0-alpha42022-08-11早期 alpha不推荐
1.0-alpha1 ~ alpha32020-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 安装成功判据(均已实测通过):

  1. mvn dependency:tree 显示 commons-imaging 1.0.0-alpha6 解析成功;
  2. 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 运行时指定。图片处理任务内存建议值:

参数建议值说明
-Xms256m初始堆,图片批处理可预热避免抖动
-Xmx256m ~ 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

十一、参考链接

  1. 官方主页:https://commons.apache.org/proper/commons-imaging/
  2. 官方下载目录:https://downloads.apache.org/commons/imaging/binaries/
  3. Maven Central 坐标页:https://repo1.maven.org/maven2/org/apache/commons/commons-imaging/
  4. 格式支持说明:https://commons.apache.org/proper/commons-imaging/formatsupport.html
  5. RELEASE-NOTES:https://downloads.apache.org/commons/imaging/RELEASE-NOTES.txt