部署后Jar包文件找不到:FopFactory实例化问题求解决方案
解决Jar包中FopFactory读取资源文件的问题
核心问题是Jar包内的资源并非独立的文件系统文件,没法直接用File对象访问,得先把资源转成临时文件再给FopFactory用,具体步骤如下:
- 从类路径获取资源输入流:打包后
src/main/resources下的文件会被放到类路径根目录,直接用/afp/fop.xconf作为路径(前面的斜杠不能丢) - 创建临时文件存放配置内容,设置JVM退出时自动删除
- 将输入流内容拷贝到临时文件
- 用临时文件实例化FopFactory
代码示例(纯JDK实现)
// 1. 获取资源输入流 try (InputStream configStream = getClass().getResourceAsStream("/afp/fop.xconf")) { if (configStream == null) { throw new RuntimeException("找不到fop.xconf配置文件"); } // 2. 创建临时文件,JVM退出时自动删除 File tempConfig = File.createTempFile("fop", ".xconf"); tempConfig.deleteOnExit(); // 3. 拷贝流到临时文件 Files.copy(configStream, tempConfig.toPath(), StandardCopyOption.REPLACE_EXISTING); // 4. 实例化FopFactory final var fopFactory = FopFactory.newInstance(tempConfig); // 后续业务逻辑... } catch (IOException e) { throw new RuntimeException("加载Fop配置失败", e); }
简化写法(用Apache Commons IO)
如果项目已引入Apache Commons IO依赖,可借助IOUtils简化流拷贝:
try (InputStream configStream = getClass().getResourceAsStream("/afp/fop.xconf")) { if (configStream == null) { throw new RuntimeException("找不到fop.xconf配置文件"); } File tempConfig = File.createTempFile("fop", ".xconf"); tempConfig.deleteOnExit(); IOUtils.copy(configStream, new FileOutputStream(tempConfig)); final var fopFactory = FopFactory.newInstance(tempConfig); // 后续业务逻辑... } catch (IOException e) { throw new RuntimeException("加载Fop配置失败", e); }
注意事项:
- 核对资源路径:如果
afp目录嵌套在resources下的其他目录中,要对应调整路径 - 临时文件会随JVM退出自动删除,长期运行的服务也可考虑用完手动删除
- 必须处理
configStream为null的情况,避免空指针异常
内容的提问来源于stack exchange,提问作者user11491936
相关产品推荐
相关产品推荐

