JBPM项目修改REST请求代码后重构无法读取properties报invalid block type错误
问题根因初步判断
你遇到的java.util.zip.ZipException: invalid block type本质上是JVM读取jar包的时候识别到包结构损坏,不是environment.properties文件不存在——如果真的找不到文件,getResourceAsStream会返回null,触发的是空指针异常,而不是zip解压相关的报错。你看到的"找不到属性文件"的日志是你自己catch所有异常后打印的通用提示,和实际错误原因不符。
可能和pom.xml相关的诱因
- maven-assembly-plugin和maven-jar-plugin执行顺序冲突:你的pom里同时配置了
maven-jar-plugin(默认打普通jar)和maven-assembly-plugin(package阶段打合并依赖的jar,且配置了appendAssemblyId=false直接覆盖原jar),如果两个插件执行过程中出现文件写入冲突,很容易导致最终生成的jar包头/压缩块损坏。可以先把assembly插件临时注释掉重新构建,看报错是否消失。 - 资源文件过滤配置异常:你给
src/main/resources配置的是filtering=false本身没问题,但如果你的environment.properties里有特殊的二进制字符、或者在构建过程中被其他插件(比如maven-remote-resources-plugin)意外修改了编码,也可能导致文件在jar包里的存储块损坏。 - templating-maven-plugin和maven-compiler-plugin的生成目录冲突:你把sourceDirectory指向了自动生成的代码目录,如果编译过程中临时文件写入到target/classes下和资源文件的写入出现并发冲突,也可能导致jar打包异常。
和pom无关的其他常见诱因
- 本地maven仓库缓存损坏:你新增的代码没有涉及任何资源读取逻辑的修改,很可能是这次clean构建的时候,依赖的某个第三方jar包下载的时候损坏了,直接删一下本地maven仓库里对应JBPM相关依赖的目录,重新构建下载即可。
- Eclipse构建缓存冲突:Eclipse的增量构建和maven的命令行构建经常出现缓存不一致的情况,先关掉Eclipse,手动删除项目根目录下的target文件夹,再用
mvn clean package命令行单独构建,看生成的jar包是否能正常解压(直接用压缩软件打开看里面的environment.properties能不能正常打开查看内容)。 - Jar包传输/部署过程损坏:如果构建出来的本地jar包能正常打开,那就是你部署到JBPM容器的过程中文件传输出现了字节丢失,重新传一遍即可。
- JDK版本兼容性问题:你指定的编译版本是JDK8,如果运行JBPM的容器用的是更低版本的JDK,或者不同厂商的JDK(比如OpenJDK和OracleJDK的zip解析逻辑有微小差异),也可能出现这类解压异常。
临时验证方法
你可以先在读取资源的代码里加一行校验,确认是不是jar本身的问题:
try (final InputStream input = Utils.class.getClassLoader().getResourceAsStream("environment.properties")) { // 先打印输入流的实现类,如果是JarURLConnection的输入流基本就是jar包本身损坏 LOGGER.debug("Input stream type: {}", input.getClass().getName()); // 先读几个字节测试,看能不能正常读,不要直接加载到Properties byte[] test = new byte[10]; int read = input.read(test); LOGGER.debug("First 10 bytes read: {}", read); properties.load(input); } catch (Exception e) { LOGGER.error("Load properties failed", e); // 直接打印完整异常,不要自己写误导性的提示 }
内容的提问来源于stack exchange,提问作者Dr Dave
相关产品推荐
相关产品推荐

