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
相关产品推荐
相关产品推荐

