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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:45:42