You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JPMS(Java 17)环境嵌入式集成Apache Fop及版本适配问题

在JPMS(Java 17)环境中嵌入式使用Apache FOP 2.9的解决方案

问题原因分析

Apache FOP 2.9对JPMS模块支持进行了调整,相比2.8版本,模块结构和依赖导出规则有变化,直接沿用旧的pom.xml和module-info.java配置会导致编译时无法找到org.apache.fop.apps包。

步骤1:更新POM依赖配置

调整FOP 2.9的依赖,优化排除项并确保依赖的模块兼容JPMS:

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>fop</artifactId>
    <version>2.9</version>
    <exclusions>
        <!-- 排除非JPMS兼容的旧版Xalan依赖,改用JDK自带的XML处理实现 -->
        <exclusion>
            <groupId>xalan</groupId>
            <artifactId>serializer</artifactId>
        </exclusion>
        <exclusion>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
        </exclusion>
        <!-- Batik-script依赖若无需使用可继续排除,但需确保其他Batik模块正常引入 -->
        <exclusion>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-script</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 显式引入兼容JPMS的xmlgraphics.commons版本(FOP 2.9默认依赖,但显式声明更稳妥) -->
<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>xmlgraphics.commons</artifactId>
    <version>2.9</version>
</dependency>

步骤2:修正module-info.java配置

FOP 2.9的模块导出规则要求显式声明更多依赖模块,调整后的内容如下:

module your.module.name {
    requires Saxon.HE;
    requires transitive org.slf4j;
    requires java.prefs;
    requires fop;
    requires xmlgraphics.commons;
    requires java.xml;
    // FOP 2.9依赖的Batik模块已JPMS化,需显式声明
    requires batik.util;
    requires batik.xml;
    requires batik.css;
    // 若使用PDF生成外的其他功能,可能需要额外添加以下模块
    // requires batik.anim;
    // requires batik.bridge;
}

注意:替换your.module.name为你的实际模块名称。

步骤3:验证代码兼容性

你的原有FOP使用代码无需修改,保持即可:

FopFactoryBuilder builder = new FopFactoryBuilder(basePath.toUri()).setPageHeight("297mm")
        .setPageWidth("210mm");
FopFactory fopFactory = builder.build();
out = new BufferedOutputStream(Files.newOutputStream(r));
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
Source src = new StreamSource(fo.toFile());
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);

关键注意点

  • 确保所有依赖的库都支持JPMS:FOP 2.9及配套的xmlgraphics.commons、Batik模块均已完成JPMS适配,避免引入非模块化的旧版依赖。
  • 若仍出现包缺失问题,可通过jdeps工具分析FOP 2.9的模块依赖:jdeps -m fop,查看需要显式声明的requires模块。

内容的提问来源于stack exchange,提问作者ngong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:53:30