Java 專案若需高效能圖片處理(縮圖、轉檔、銳化、特效),ImageMagick 是 C 語言撰寫的業界標準庫,但 Java 無法直接透過 JNI 呼叫。JMagick 以 C 實作 JNI 橋接層,讓 Java 經由 JMagick → ImageMagick 完成圖片運算。本文涵蓋:依賴套件安裝、ImageMagick RPM/編譯安裝、JMagick 32/64 位元 RPM 與原始碼編譯、常見錯誤排解、Tomcat 整合驗證,適用 CentOS/RHEL 6/7 系列。
yum install -y libjpeg libjpeg-devel libpng libpng-devel \
libtiff libtiff-devel libungif libungif-devel freetype zlib
# 驗證
rpm -qa | grep -E 'libjpeg|libpng|libtiff|freetype|zlib'
yum remove -y ImageMagick # 移除舊版
yum install -y ImageMagick # 自動解決依賴
cd /usr/local/src
wget https://downloads.jmagick.org/6.4.0/ImageMagick-6.4.0-0.tar.gz
tar zxvf ImageMagick-6.4.0-0.tar.gz
cd ImageMagick-6.4.0
./configure --enable-shared --without-perl
make && make install && make check
驗證:
find / -name convert
convert --version
convert -geometry 100x200 src.jpg out.gif # 測試指令列轉檔
yum install -y java-1.8.0-openjdk-devel
/usr/sbin/useradd -u 1000 -s /sbin/nologin jman
rpm -ivh jmagick-6.4.0-3.i386.rpm
rpm -ivh jmagick-6.4.0-3.src.rpm
rpm -ivh jmagick-6.4.0-3.x86_64.rpm
rpm -ivh jmagick-6.4.0-3.src.rpm
rpm -ivh jmagick-debuginfo-6.4.0-3.x86_64.rpm
若 src.rpm 報 cannot create %sourcedir /usr/src/redhat/SOURCES:
mkdir -p /usr/src/redhat/SOURCES
tar zxvf jmagick-6.4.0-src.tar.gz
cd jmagick-6.4.0-src
./configure --prefix=/opt/jmagick-6.4.0 \
--with-java-home=/usr/lib/jvm/java-1.8.0 \
--with-magick-home=/usr/local/ImageMagick-6.4.0
make all && make install
產出 /opt/jmagick-6.4.0/lib/jmagick-6.4.0.jar。
# 複製 jar 至 Tomcat classpath (建議放在 shared/lib 或 webapp WEB-INF/lib)
cp /opt/jmagick-6.4.0/lib/jmagick-6.4.0.jar /usr/local/tomcat/lib/
# 重啟 Tomcat 使 JNI 庫載入
systemctl restart tomcat
關鍵提醒:JMagick 編譯時綁定的 JDK 版本 (如 1.8) 必須與執行環境一致,跨大版本 (1.7 vs 1.8) 會導致 UnsatisfiedLinkError。
| 錯誤訊息 | 原因 | 解決 |
|---|---|---|
| error: Failed dependencies: jre is needed by jmagick | 缺少 JDK/JRE | yum install java-1.8.0-openjdk-devel |
| UnsatisfiedLinkError: no jmagick in java.library.path | .so 檔未在 library path | 確認 LD_LIBRARY_PATH 包含 ImageMagick lib 目錄,或 -Djava.library.path |
| Tomcat 啟動後仍報錯 | 未重啟 Tomcat | 必須重啟 Tomcat 讓 JNI 重新載入 |
| convert: delegate library support not built-in | ImageMagick 編譯缺少 delegate | 安裝完整依賴後重新編譯 ImageMagick |
若不想維護 JMagick 原始碼,可改用 JNA (Java Native Access) 直接映射 ImageMagick C 函式,僅需 jna.jar 與 libMagickCore.so 即可,部署更輕量。
CentOS 7 源碼編譯安裝 Nagios 4.x 完整教程:從依賴到 Web 界面
Linux 掛載 FAT32/NTFS U 盤中文亂碼徹底解決:iocharset 與 codepage 參數詳解
Linux cp 硬連結實戰:零磁碟空間實現大檔案 HTTP 下載
Linux 內存查看命令 free -m 詳細教程:輸出字段解讀與可用內存計算
Linux 密碼檔案安全深度解析:/etc/passwd、/etc/shadow 與影子密碼機制
Ubuntu 格式化 USB 隨身碟指令大全:mkfs.vfat/ntfs/ext4 圖形與命令列雙軌