Maven assembly插件构建fat jar时如何处理已签名依赖的校验错误
Maven Assembly打包签名依赖报错解决方案
你遇到的签名校验报错,根本原因是maven-assembly-plugin在解压已签名的依赖jar时,会默认校验文件签名和manifest中声明的摘要是否一致,你把签名文件排除的操作是在解压后的打包阶段执行的,校验在解压阶段就已经触发,所以之前的配置不生效。
方案1:关闭assembly插件的签名校验
直接在maven-assembly-plugin的全局配置中添加verifySignature参数关闭解压时的签名校验,配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <!-- 关闭解压依赖时的签名校验 --> <verifySignature>false</verifySignature> <archive> <manifest> <!-- 此处配置你的主类等manifest信息 --> <mainClass>com.xxx.YourMainClass</mainClass> </manifest> </archive> <descriptors> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
保留你原来assembly配置里的unpackOptions排除规则,即可同时把签名相关文件从最终fat jar中移除,避免运行时JVM再校验签名。
方案2:补充排除规则(可选)
如果方案1执行后还有报错,可以在unpackOptions的排除规则中额外添加依赖的manifest文件排除,避免依赖的签名manifest和你项目自身的manifest冲突:
<unpackOptions> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> <exclude>META-INF/*.MF</exclude> </excludes> </unpackOptions>
额外建议
- 如果你后续不想继续用assembly插件,也可以尝试maven-shade-plugin,它的
artifactSet配置支持指定scope,也可以通过include/exclude精准控制要打包的依赖,同时内置了签名文件移除的transformer,也能满足你的多scope依赖打包需求 - 如果你不想把所有依赖都解压到fat jar中,可以使用
spring-boot-maven-plugin,即使是非Spring项目也可以用它的JarLoader实现jar-in-jar加载,该插件支持灵活配置要包含的依赖scope,也内置了签名文件排除逻辑,无需手动编写复杂的assembly配置
内容的提问来源于stack exchange,提问作者Lucien David
相关产品推荐
相关产品推荐

