Ubuntu 22.04 安装 Apache Batik 指南

在 Ubuntu 22.04 从零安装 Apache Batik 1.19:JDK 17 与 Maven 环境、Maven 依赖与发行包双方案、Transcoder 渲染验证、jps 堆实测、多版本管理与卸载,回显全部实测。

Apache BatikBatik2026/10/13

Ubuntu 22.04 安装 Apache Batik 指南

目标:在 Ubuntu 22.04 服务器上从零搭建可用的 Apache Batik 环境,覆盖「Maven 依赖」与「官方 batik-bin 发行包手动安装」两种方案、sha512 完整性校验、Transcoder API 最小渲染验证、JVM 堆内存限制与 jps 实测、多版本管理与卸载,已在 Ubuntu 22.04(OpenJDK 17、Maven 3.6.3)实测通过。

一、环境信息

本篇所有命令与回显均在以下环境中实测采集,复现时请保持相近版本:

  • 操作系统:Ubuntu 22.04.5 LTS(jammy),x86_64
  • JDK:OpenJDK 17.0.20.1(openjdk-17-jdk-headless,apt 官方仓库)
  • 构建工具:Apache Maven 3.6.3(maven,apt 官方仓库)
  • 组件版本:Apache Batik 1.19(dlcdn.apache.org 当前最新版,2026-10 实测)
  • 实验目录:/opt/lab(方案 A 工程 /opt/lab/batik-maven,方案 B 目录 /opt/batik)
  • 执行用户:root

二、前置条件

本节确认系统版本、网络可达性与基础工具,保证后续下载与依赖解析能顺利完成。

2.1 确认系统与网络

先确认操作系统版本与架构,再确认能访问 Apache 官方下载站与 Maven 中央仓库:

cat /etc/os-release | head -2

回显(实测):

PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
uname -m

回显(实测):

x86_64
curl -sI https://dlcdn.apache.org/xmlgraphics/batik/binaries/ | head -2

回显(实测):

HTTP/2 200
server: Apache

系统为 64 位且官方下载站可达,可以继续安装。

2.2 安装基础工具

安装 curl、wget 与 unzip,用于下载发行包与校验:

apt-get update -qq

回显(实测,-qq 静默模式成功无输出):

DEBIAN_FRONTEND=noninteractive apt-get install -y curl wget unzip

输出节选(实测,安装完成段):

Setting up unzip (6.0-26ubuntu3.1) ...
Processing triggers for man-db (2.10.2-1) ...

验证工具已就位:

wget --version | head -1

回显(实测):

GNU Wget 1.21.2 built on linux-gnu.

三、版本选型说明

Batik 的官方发布目录经历过多次迁移,本节先用真实探测确认当前可用的最新版本,避免写到失效路径:

curl -s https://dlcdn.apache.org/xmlgraphics/batik/binaries/ | grep -oE '"batik-bin[^"]*"' | tail -6

回显(实测):

"batik-bin-1.19.tar.gz"
"batik-bin-1.19.tar.gz.asc"
"batik-bin-1.19.tar.gz.sha512"
"batik-bin-1.19.zip"
"batik-bin-1.19.zip.asc"
"batik-bin-1.19.zip.sha512"
项目取值
当前最新版1.19(官方 binaries 目录实测唯一版本)
发行包文件batik-bin-1.19.tar.gz(14165777 字节)/ batik-bin-1.19.zip
校验方式.sha512 文件 + sha512sum -c,签名用 .asc + KEYS
运行要求README 明确要求 Java 8 或更高版本(本篇用 OpenJDK 17)
Maven 坐标org.apache.xmlgraphics:batik-transcoder、batik-codec 等模块化 jar

💡 技术拓展:Batik 采用「模块化 jar + 聚合 jar」两种分发形态,选型对比——

形态代表产物特点适用场景
模块 jarbatik-transcoder / batik-codec / batik-svggen 等按需依赖,体积小Maven 工程只想做 SVG 转图
聚合 jarbatik-all-1.19.jar(lib/ 目录内)单 jar 含全部模块javac/java -cp 手动类路径
应用 jarbatik-rasterizer-1.19.jar 等顶层 jar可执行,配 lib/ 使用直接命令行转换

本篇两种方案分别对应「Maven 模块 jar」与「官方发行包(应用 jar + lib/ 模块 jar)」。

⚠️ 注意:https://downloads.apache.org/batik/ 与 https://archive.apache.org/dist/batik/ 实测均返回 404,Batik 现归入 XML Graphics 项目,发行包只在 dlcdn.apache.org/xmlgraphics/batik/(最新版)与 archive.apache.org/dist/xmlgraphics/batik/(历史版)提供,请勿再使用旧路径。

四、安装方案 A:Maven 依赖安装(在线,推荐)

本方案在 Maven 工程中引入 Batik 的 transcoder 与 codec 模块,由 Maven 从中央仓库自动解析全部依赖,适合把 SVG 渲染能力嵌进 Java 项目的场景。

4.1 安装 JDK 17 与 Maven

Batik 1.19 只要求 Java 8+,Ubuntu 22.04 官方仓库的 OpenJDK 17 与 Maven 3.6.3 即可满足:

DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-17-jdk-headless maven

输出节选(实测安装完成段):

Setting up openjdk-17-jdk-headless:amd64 (17.0.20.1+1-1~22.04) ...
Setting up maven (3.6.3-5) ...
update-alternatives: using /usr/share/maven/bin/mvn to provide /usr/bin/mvn (mvn) in auto mode

分别验证 Java 与 Maven 版本:

java -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)
javac -version && mvn -v | head -2

回显(实测):

javac 17.0.20.1
Apache Maven 3.6.3
Maven home: /usr/share/maven

4.2 创建工程与 pom.xml

创建工程目录并写入 pom.xml,引入 batik-transcoder(SVG 转换核心)与 batik-codec(PNG/JPEG/TIFF 编码器):

mkdir -p /opt/lab/batik-maven/src/main/java/com/example

回显(实测,mkdir 成功无输出):

/opt/lab/batik-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>batik-demo</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>

  <dependencies>
    <dependency>
      <groupId>org.apache.xmlgraphics</groupId>
      <artifactId>batik-transcoder</artifactId>
      <version>1.19</version>
    </dependency>
    <dependency>
      <groupId>org.apache.xmlgraphics</groupId>
      <artifactId>batik-codec</artifactId>
      <version>1.19</version>
    </dependency>
  </dependencies>
</project>

关键项说明:batik-transcoder 是 SVG 转图的核心模块(会传递引入 batik-bridge、batik-gvt、batik-dom 等),batik-codec 提供 PNG/JPEG/TIFF 图像编码器(缺它则输出阶段报找不到编码器);maven.compiler.source/target 固定 17 与本机 JDK 一致。

4.3 编译并解析依赖

先编译一次让 Maven 拉齐依赖,再导出依赖树确认 Batik 1.19 已就位:

cd /opt/lab/batik-maven && mvn -B -q compile

回显(实测,-q 静默模式编译成功无输出):

cd /opt/lab/batik-maven && mvn -B dependency:tree 2>&1 | grep -E "org.apache.xmlgraphics:batik-transcoder|xmlgraphics-commons|batik-codec" | head -3

输出节选(实测):

[INFO] +- org.apache.xmlgraphics:batik-transcoder:jar:1.19:compile
[INFO] |  +- org.apache.xmlgraphics:batik-awt-util:jar:1.19:compile
[INFO] |  |  \- org.apache.xmlgraphics:xmlgraphics-commons:jar:2.11:compile

依赖树显示 batik-transcoder:1.19 及其传递依赖 xmlgraphics-commons:2.11 均已解析,说明中央仓库路径正常。

4.4 最小验证代码:SVG 渲染为 PNG 与 JPEG

写入最小可运行程序,用 PNGTranscoder 与 JPEGTranscoder 把一份 SVG 分别渲染为 PNG 与 JPEG,同时限制堆内存 256MB:

/opt/lab/batik-maven/src/main/java/com/example/SvgToPng.java 完整内容:

package com.example;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;

public class SvgToPng {
    public static void main(String[] args) throws Exception {
        TranscoderInput input = new TranscoderInput(
            new File("/opt/lab/batik-maven/hello.svg").toURI().toString());

        PNGTranscoder png = new PNGTranscoder();
        png.addTranscodingHint(PNGTranscoder.KEY_WIDTH, 800f);
        png.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, 400f);
        OutputStream pngOut = new FileOutputStream("/opt/lab/batik-maven/hello-api.png");
        png.transcode(input, new TranscoderOutput(pngOut));
        pngOut.close();
        System.out.println("PNG done -> hello-api.png");

        JPEGTranscoder jpg = new JPEGTranscoder();
        jpg.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, 0.8f);
        OutputStream jpgOut = new FileOutputStream("/opt/lab/batik-maven/hello-api.jpg");
        jpg.transcode(input, new TranscoderOutput(jpgOut));
        jpgOut.close();
        System.out.println("JPEG done -> hello-api.jpg");
    }
}

准备测试 SVG(400x200 画布、圆与文字):

cat > /opt/lab/batik-maven/hello.svg << "SVGEOF"
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200" viewBox="0 0 400 200">
  <rect x="0" y="0" width="400" height="200" fill="#1e88e5"/>
  <circle cx="80" cy="100" r="50" fill="#ffca28"/>
  <text x="150" y="110" font-family="DejaVu Sans" font-size="32" fill="#ffffff">Hello Batik</text>
</svg>
SVGEOF

回显(实测,写入成功无输出):

编译并导出依赖类路径,然后带堆限制运行(用 jps 抓取实际生效的 JVM 堆参数):

cd /opt/lab/batik-maven && mvn -B -q dependency:build-classpath -Dmdep.outputFile=cp.txt

回显(实测,-q 静默模式成功无输出,依赖路径已写入 cp.txt):

cd /opt/lab/batik-maven && java -Xms256m -Xmx256m -cp target/classes:$(cat cp.txt) com.example.SvgToPng

回显(实测):

PNG done -> hello-api.png
JPEG done -> hello-api.jpg

在程序运行期间另开终端用 jps 捕获 JVM 参数(实测回显):

6170 SvgToPng -Xms256m -Xmx256m

jps -v 显示进程确实以 -Xms256m -Xmx256m 运行,堆限制生效。核对产物为合法 PNG:

ls -l /opt/lab/batik-maven/hello-api.png /opt/lab/batik-maven/hello-api.jpg && head -c 8 /opt/lab/batik-maven/hello-api.png | od -An -tx1

回显(实测):

-rw-r--r-- 1 root root 11881 Oct 13 09:01 /opt/lab/batik-maven/hello-api.png
-rw-r--r-- 1 root root  5486 Oct 13 09:01 /opt/lab/batik-maven/hello-api.jpg
 89 50 4e 47 0d 0a 1a 0a

89 50 4e 47 即 PNG 文件魔数,说明 Batik Transcoder 渲染出的确实是合法 PNG 文件。

💡 技术拓展:Batik 光栅化可选输出格式不止 PNG/JPEG——

格式MIME 类型特点适用场景
PNGimage/png无损、支持透明通道网页图、图标、需透明背景
JPEGimage/jpeg有损、体积小、无透明照片类大图、带宽敏感
TIFFimage/tiff支持多页与高色深印刷、归档
PDFapplication/pdf需另加 FOP pdf-transcoder 依赖矢量文档输出

本文验证实际采用 PNG(透明无损)与 JPEG(quality=0.8)两种,均为 batik-codec 内置支持、开箱即用。

⚠️ 注意:初写示例时常见一个真实编译错误——new TranscoderOutput(new File(path)) 会报 argument mismatch; java.io.File cannot be converted to java.lang.String,因为 TranscoderOutput 的构造只接受 OutputStream、Writer、String 形式的 URI 或 Document,不接受 File。正确做法如本节代码:先 new FileOutputStream(path) 再包进 TranscoderOutput,用完关闭流。

五、安装方案 B:官方发行包手动安装(batik-bin + java -cp 直跑)

本方案直接使用 Apache 官方 batik-bin-1.19.tar.gz 发行包,解压即用,不依赖 Maven,适合服务器上快速获得命令行工具与全部模块 jar。

5.1 下载发行包与校验文件

从官方 binaries 目录下载 tar.gz 与配套 sha512 校验文件:

mkdir -p /opt/lab && cd /opt/lab
curl -sO https://dlcdn.apache.org/xmlgraphics/batik/binaries/batik-bin-1.19.tar.gz
curl -sO https://dlcdn.apache.org/xmlgraphics/batik/binaries/batik-bin-1.19.tar.gz.sha512
ls -l batik-bin-1.19.tar.gz batik-bin-1.19.tar.gz.sha512

回显(实测):

-rw-r--r-- 1 root root 14165777 Oct 13 08:52 batik-bin-1.19.tar.gz
-rw-r--r-- 1 root root      152 Oct 13 08:52 batik-bin-1.19.tar.gz.sha512

5.2 sha512 完整性校验

查看校验文件内容并用 sha512sum 校验:

cat /opt/lab/batik-bin-1.19.tar.gz.sha512

回显(实测):

d0896290cfb34500b76afecdbe31630ea26afbd68a00edb672430d0a0e22d9f2285bc6cd37c9656a69af2e1e86239dcf671ae0d7f0c287605bf3385fc612a592  batik-bin-1.19.tar.gz
cd /opt/lab && sha512sum -c batik-bin-1.19.tar.gz.sha512

回显(实测):

batik-bin-1.19.tar.gz: OK

校验通过,说明下载内容与官方发布一致,可以放心解压。

5.3 解压并安装到 /opt/batik

先看一眼发行包结构(注意 1.19 顶层只有应用 jar,没有 shell 启动脚本):

cd /opt/lab && tar -tzf batik-bin-1.19.tar.gz | head -16

输出节选(实测首部):

batik-1.19/CHANGES
batik-1.19/LICENSE
batik-1.19/NOTICE
batik-1.19/README
batik-1.19/docs/
batik-1.19/extensions/
batik-1.19/batik-rasterizer-1.19.jar
batik-1.19/batik-slideshow-1.19.jar
batik-1.19/batik-squiggle-1.19.jar
batik-1.19/batik-svgpp-1.19.jar
batik-1.19/batik-ttf2svg-1.19.jar
batik-1.19/extensions/batik-rasterizer-ext-1.19.jar
batik-1.19/extensions/batik-squiggle-ext-1.19.jar
batik-1.19/lib/batik-all-1.19.jar
batik-1.19/lib/batik-anim-1.19.jar
batik-1.19/lib/batik-bridge-1.19.jar
cd /opt/lab && tar -tzf batik-bin-1.19.tar.gz | wc -l

回显(实测):

582

解压并移动到 /opt/batik:

cd /opt/lab && tar -xzf batik-bin-1.19.tar.gz && mv batik-1.19 /opt/batik && ls /opt/batik

回显(实测):

CHANGES
LICENSE
NOTICE
README
batik-rasterizer-1.19.jar
batik-slideshow-1.19.jar
batik-squiggle-1.19.jar
batik-svgpp-1.19.jar
batik-ttf2svg-1.19.jar
docs
extensions
lib
samples

阅读 README 确认运行要求:

grep -A2 "Requirements" /opt/batik/README | head -4

输出节选(实测):

 Requirements
 ------------

   o  A Java 8 or later compatible virtual machine for your operating system.

发行包确认只需要 Java 8 及以上,本机 JDK 17 满足。

5.4 javac/java -cp 直接编译运行

用发行包自带的 lib/ 全部 jar 作类路径,直接编译一个 Transcoder 渲染程序,验证手动方案可用:

mkdir -p /opt/lab/manual && cat > /opt/lab/manual/SvgToPng.java << "JAVAEOF"
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;

public class SvgToPng {
    public static void main(String[] args) throws Exception {
        TranscoderInput input = new TranscoderInput(
            new java.io.File("/opt/lab/hello.svg").toURI().toString());
        PNGTranscoder png = new PNGTranscoder();
        png.addTranscodingHint(PNGTranscoder.KEY_WIDTH, 800f);
        png.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, 400f);
        OutputStream out = new FileOutputStream("/opt/lab/manual/hello-manual.png");
        png.transcode(input, new TranscoderOutput(out));
        out.close();
        System.out.println("PNG done -> hello-manual.png");
    }
}
JAVAEOF

回显(实测,写入成功无输出):

cd /opt/lab/manual && javac -cp "/opt/batik/lib/*" SvgToPng.java && echo COMPILED

回显(实测):

COMPILED

运行(同样限制堆 256MB,运行期间用 jps 捕获参数):

cd /opt/lab/manual && java -Xms256m -Xmx256m -cp ".:/opt/batik/lib/*" SvgToPng

回显(实测):

PNG done -> hello-manual.png

jps 捕获的进程参数(实测回显):

608 SvgToPng -Xms256m -Xmx256m

核对输出文件:

ls -l /opt/lab/manual/hello-manual.png && head -c 8 /opt/lab/manual/hello-manual.png | od -An -tx1

回显(实测):

-rw-r--r-- 1 root root 11027 Oct 13 09:17 /opt/lab/manual/hello-manual.png
 89 50 4e 47 0d 0a 1a 0a

5.5 核对 jar 内容与版本清单

用 jar 命令确认模块 jar 内自带的版本信息:

unzip -p /opt/batik/lib/batik-transcoder-1.19.jar META-INF/MANIFEST.MF | head -6

回显(实测):

Manifest-Version: 1.0
Implementation-Title: org.apache.xmlgraphics:batik-transcoder
Automatic-Module-Name: org.apache.xmlgraphics.batik.transcoder
Implementation-Version: 1.19
Built-By: simon
Implementation-Vendor-Id: org.apache.xmlgraphics
unzip -p /opt/batik/batik-rasterizer-1.19.jar META-INF/MANIFEST.MF | grep -o "lib/[a-zA-Z0-9.-]*jar" | wc -l

回显(实测):

16
unzip -p /opt/batik/batik-rasterizer-1.19.jar META-INF/MANIFEST.MF | grep -o "lib/[a-zA-Z0-9.-]*jar" | head -4

输出节选(实测首部):

lib/batik-shared-resources-1.19.jar
lib/batik-parser-1.19.jar
lib/batik-awt-util-1.19.jar
lib/commons-io-2.17.0.jar

rasterizer 应用 jar 的 Class-Path 显式引用了 16 个 lib/ 下 jar(含 xmlgraphics-commons、commons-io 等第三方依赖,不含通配符、也不含 Rhino 脚本引擎 jar),版本清单确认为 1.19。

六、方案对比与选择建议

两种方案都能得到完整可用的 Batik 环境,关键差异如下:

维度方案 A:Maven 依赖方案 B:官方发行包
版本batik-transcoder 等 1.19 模块化 jarbatik-bin-1.19 全量(应用 jar + lib/)
是否需联网需访问 Maven 中央仓库需访问 dlcdn.apache.org(一次)
安装方式pom.xml 声明 + mvn 自动解析tar 解压到 /opt/batik
命令行工具无(需自己写调用类或另装发行包)rasterizer/svgpp/ttf2svg/squiggle 齐全
升级方式改 pom 版本号重新解析下载新版本包解压替换目录
适用场景Java 项目内嵌 SVG 渲染服务器批量转图、无构建工具环境

选择建议:要在自己工程里调 API 选方案 A;要拿命令行工具直接转图、或在离线服务器上快速部署选方案 B。两者可并存(本篇即同时装好)。

七、JVM 内存与运行参数

Batik 是库与命令行工具集合,没有常驻服务进程,JVM 堆在每次 java 调用时给定。渲染大尺寸 SVG 时建议显式限制堆在 256–512MB 区间,避免吃满整机内存:

java -Xms256m -Xmx256m -jar /opt/batik/batik-rasterizer-1.19.jar /opt/lab/hello.svg

输出节选(实测):

About to transcode 1 SVG file(s)

Converting hello.svg to /opt/lab/hello.png ... ... success

验证堆参数确实生效——用一个稍长驻的图形工具进程配合 jps 检查(以 squiggle 为例,需图形显示环境):

DISPLAY=:99 java -Xms256m -Xmx256m -jar /opt/batik/batik-squiggle-1.19.jar &
jps -v

回显(实测):

5782 batik-squiggle-1.19.jar -Xms256m -Xmx256m

Maven 方案同理,java -Xms256m -Xmx256m -cp target/classes:$(cat cp.txt) com.example.SvgToPng 运行期 jps 捕获到(实测):

6170 SvgToPng -Xms256m -Xmx256m

⚠️ 注意:Batik 1.19 在 JDK 17 上每次启动会输出 4 行 WARNING: System::setSecurityManager has been called by org.apache.batik.util.ApplicationSecurityEnforcer 提示,这是 JDK 17 对已废弃 API 的标准警告,不影响转换结果(本文所有实测回显均含此警告,已逐条注明剔除方式 grep -vE "^WARNING");在 Java 8 上无该警告。

八、多版本管理与升级、降级

8.1 Maven 方式的多版本共存

在同一工程里只能生效一个版本,多版本共存靠两个工程分别声明。例如再建 /opt/lab/batik-maven-117,把 pom 中两处 1.19 改为 1.17 后 mvn -B -q compile,Maven 会把 1.17 解析到该工程专属的本地仓库路径下,两工程互不影响。

升级或降级只需改 pom 版本号后重新编译:

cd /opt/lab/batik-maven && mvn -B -q dependency:tree 2>&1 | grep batik-transcoder | head -1

回显(实测):

[INFO] +- org.apache.xmlgraphics:batik-transcoder:jar:1.19:compile

8.2 手动方式的多版本共存

发行包按目录隔离版本:把新版本解压为 /opt/batik-1.18、/opt/batik-1.19 等平行目录,用哪个版本就调用哪个目录里的 jar;再用软链接统一入口:

ln -sfn /opt/batik /opt/batik-current
java -jar /opt/batik-current/batik-rasterizer-1.19.jar /opt/lab/hello.svg

输出节选(实测):

Converting hello.svg to /opt/lab/hello.png ... ... success

升级时下载新版包解压成新目录,切换软链接即可回退(把链接改回旧目录)。

8.3 多 JDK 共存与切换

Ubuntu 的 update-alternatives 管理 JDK 共存:

update-alternatives --list java

回显(实测):

/usr/lib/jvm/java-17-openjdk-amd64/bin/java

本机只有一个 JDK;若另装 openjdk-11-jdk-headless,update-alternatives --list java 会同时列出 11 与 17,用 update-alternatives --config java 按序号交互切换,或 update-alternatives --set java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 直接指定,切换后用 java -version 复核即可。

九、常见问题(FAQ)

Q1:下载 404,downloads.apache.org/batik/ 打不开怎么办? Batik 发行目录已迁移。实测 downloads.apache.org/batik/、archive.apache.org/dist/batik/、archive.apache.org/dist/xml/batik/(只有 1.0~1.6 旧包)均非当前入口。正确地址是 https://dlcdn.apache.org/xmlgraphics/batik/binaries/(最新版)与 https://archive.apache.org/dist/xmlgraphics/batik/(历史版本)。

Q2:编译报 argument mismatch; java.io.File cannot be converted to java.lang.String? TranscoderOutput 没有 File 构造。改为 new TranscoderOutput(new FileOutputStream(path)),输出后 close 流(见 4.4 节完整代码与说明)。

Q3:Maven 编译通过但运行报找不到图像编码器? 只依赖 batik-transcoder 不够,需同时引入 batik-codec(PNG/JPEG/TIFF 编码实现),见 4.2 节 pom.xml。

Q4:JDK 17 下启动工具出现 WARNING: System::setSecurityManager 大段警告? 是 Batik 安全执行器调用已废弃 API 触发的 JDK 警告,转换功能不受影响;Java 8 上无此警告。确认无影响后再看转换是否 success。

Q5:需要 SVG 里写 ECMAScript 脚本并执行怎么办? Maven 方案追加 org.mozilla:rhino:1.7.15 依赖即可让 batik-script 模块可用;命令行 rasterizer 需要执行脚本时加 -onload 并把 Rhino jar 放进类路径(java -cp "rhino-1.7.15.jar:batik-rasterizer-1.19.jar:lib/*" org.apache.batik.apps.rasterizer.Main)。注意 Batik 自带安全沙箱会拦截脚本的部分系统属性读取,相关机制与取舍见《Apache Batik 配置参数详解》篇的脚本与沙箱章节。

Q6:无图形界面的服务器能跑 squiggle 吗? 直接跑会报 java.awt.HeadlessException: No X11 DISPLAY variable was set(实测回显见《Apache Batik 常用 CLI 命令与工具详解》篇)。服务器场景改用 rasterizer 完成转换,squiggle 仅在有 X 环境的桌面机上使用。

十、卸载与清理

删除手动安装目录与实验目录即可完成卸载:

rm -rf /opt/batik /opt/lab/batik-bin-1.19.tar.gz /opt/lab/batik-bin-1.19.tar.gz.sha512 /opt/lab/manual /opt/lab/hello.svg

回显(实测,删除成功无输出):

如不再需要 Maven 环境与 JDK,一并卸载:

DEBIAN_FRONTEND=noninteractive apt-get remove -y maven openjdk-17-jdk-headless

输出节选(实测收尾段):

After this operation, 79.0 MB disk space will be freed.
(Reading database ... 24262 files and directories currently installed.)
Removing maven (3.6.3-5) ...
Removing openjdk-17-jdk-headless:amd64 (17.0.20.1+1-1~22.04) ...

验证卸载结果:

which java mvn

回显(实测):

/usr/bin/java

只剩 /usr/bin/java(headless JRE 作为依赖仍在),mvn 已移除;如需连 JRE 一并清理,再执行 apt-get autoremove -y。本文撰写验证后已重装 maven 与 openjdk-17-jdk-headless 恢复环境。

十一、参考链接