Java/Maven新手配置pulsar依赖打assembly包报Invalid signature file错
问题根源
报错Invalid signature file digest for Manifest main attributes的触发逻辑非常明确:
- maven-assembly插件生成
jar-with-dependencies格式的胖包时,会把所有依赖JAR的类文件、元数据全部抽取合并到最终单个JAR中 - 你的pulsar 2.7.0依赖链中包含了带官方发布签名的第三方组件,这类组件的JAR包META-INF目录下会留存
.SF、.DSA、.RSA、.EC后缀的签名校验文件 - 当前配置未对这类签名文件做排除,这些元数据被打包进最终JAR后,会和自定义的Manifest主属性产生签名摘要校验冲突,直接触发打包失败
- 另外你的pom未显式指定maven-assembly-plugin的版本,实际拉取的2.2-beta-5是老旧beta测试版本,本身没有内置签名文件过滤逻辑,进一步放大了这个问题。
可落地修复步骤
直接对pom.xml中的maven-assembly-plugin配置做三处调整即可,不需要修改现有依赖坐标:
- 给插件显式指定3.6.0稳定版本,替代自动拉取的2.2-beta-5旧测试版
- 在打包配置中新增规则,排除所有来源JAR中的签名类元数据文件
- 替换旧版专属的
assembly打包goal为3.x版本对应的single目标,适配新版插件的执行逻辑
调整后的完整插件配置如下,直接替换你原有pom里的同插件块即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>org.example.test.ExclamationFunction</mainClass> </manifest> </archive> <!-- 排除所有依赖中的签名校验元数据 --> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> <exclude>META-INF/*.EC</exclude> </excludes> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
调整完成后执行mvn clean package重新触发打包流程即可,不需要修改pulsar相关的依赖配置。
补充说明:这类签名报错的排查不需要逐一对依赖做逆向校验,只要是打带依赖的胖包场景,只要在打包配置里把META-INF下的四类签名后缀文件排除,就能覆盖绝大多数同类场景。
内容的提问来源于stack exchange,提问作者omriman12
相关产品推荐
相关产品推荐

