在 Spring Boot 应用程序 (2.3.3) 上,我依赖于我公司开发的模块。我从服务中调用此依赖项中的方法,该方法需要从资源加载文件 (
src/main/resources/META-INF/spring-main-cfg.xml
),因此我已将此文件复制并粘贴到我的 Spring Boot 应用程序资源中。
这是在该依赖项中执行的代码:
InputStream in = RSAEncrypter.class.getClassLoader().getResourceAsStream(keyFileName);
// StreamCorruptedException here
ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in));
堆栈:
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:936) ~[na:1.8.0_281]
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:394) ~[na:1.8.0_281]
问题是,我创建了一个新的虚拟 Maven 项目,仅包含此依赖项和一个用于执行该代码的 main 项目,并且它可以工作。
我不明白我的 Spring Boot 应用程序执行此异常的原因是什么。我有相同的Java版本,读取的文件是相同的。
如何修复此问题以防止发生此异常?
我终于找到了问题,这是文件本身,因为我有一个全局:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
Maven 文档对此表示:
警告:不要过滤具有图像等二进制内容的文件!这很可能会导致输出损坏。
https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html
所以我刚刚为我的文件添加了一个例外:
<resources>
<!-- Only properties files have to be filtered.
META-INF/spring-main-cfg.xml must not be or StreamCorruptedException occure by reading it -->
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>