Apache FOP跨平台问题:AS400生成的PDF缺失附件
Apache FOP跨平台(Windows/AS400)PDF附件缺失问题的依赖处理方案
核心问题本质
Windows(Oracle JVM)和AS400(IBM JVM)对类加载、SPI服务配置的处理逻辑存在差异,加上maven shade打包时的依赖顺序/资源合并规则,会导致PDF附件嵌入所需的PDFBox组件在AS400环境下无法正常加载。依赖顺序确实是关键影响因素之一。
调整POM依赖顺序与冲突排除
1. 强制PDFBox依赖优先于FOP
将PDFBox相关核心依赖放在FOP依赖之前引入,确保shade打包时优先采用完整的PDFBox版本,而非FOP自带的碎片化依赖:
<dependencies> <!-- PDFBox核心组件,必须放在FOP之前 --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>你的实际版本</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>你的实际版本</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>xmpbox</artifactId> <version>你的实际版本</version> </dependency> <!-- Apache FOP,排除自带的PDFBox依赖避免冲突 --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifactId> <version>你的实际版本</version> <exclusions> <exclusion> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> </exclusion> <exclusion> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> </exclusion> <exclusion> <groupId>org.apache.pdfbox</groupId> <artifactId>xmpbox</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
2. 修正Shade打包配置
AS400的IBM JVM严格依赖META-INF/services下的SPI配置文件,必须确保shade打包时不合并或覆盖这些文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 保留所有SPI服务配置文件,不合并 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 保留主类入口 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>你的主类全路径</mainClass> </transformer> </transformers> <!-- 排除签名文件,避免打包冲突 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
验证步骤
- 打包后检查jar包内的
META-INF/services/org.apache.pdfbox.io.RandomAccessFactory文件,确认包含org.apache.pdfbox.io.RandomAccessFile等IBM JVM兼容的实现类。 - 在AS400上运行时添加JVM参数
-verbose:class,查看PDFBox相关类的加载来源,确认是你指定的完整版本。
内容的提问来源于stack exchange,提问作者Roberto P.
相关产品推荐
相关产品推荐

