如何修复IntelliJ Gradle Kotlin项目构建jar包时因mssql-jdbc依赖报错问题
问题根因
问题出在com.microsoft.sqlserver:mssql-jdbc:6.2.2.jre8依赖自带的数字签名文件和IDEA默认打胖Jar的逻辑冲突:该依赖的Jar包META-INF目录下存在MSFTSIG.SF、MSFTSIG.RSA等签名校验文件,当你把所有依赖解压合并成单个可运行Jar时,签名文件会保留,但合并后的Jar内容已经和原始签名匹配不上,JVM加载Jar时校验签名失败,就会抛出找不到主类的错误。
修复方案
方案1:修改IDEA Artifact配置(适合继续用IDEA手动构建的场景)
- 打开IDEA项目结构(快捷键
Ctrl+Alt+Shift+S),进入「Artifacts」选项卡,选中你当前的可运行Jar构建配置 - 在输出布局的「Available Elements」列表中,找到
mssql-jdbc-6.2.2.jre8.jar依赖项,展开其META-INF目录,删除所有后缀为.SF、.RSA、.DSA的签名文件 - 保存配置后重新构建Artifact即可正常运行
方案2:通过Gradle配置自动构建(更稳定,避免重复手动操作)
在你现有的build.gradle文件末尾添加如下配置,直接通过Gradle的jar任务构建可运行Jar:
jar { manifest { // 填写实际主类全路径,和报错信息里的主类名保持一致即可 attributes 'Main-Class': 'hu.qlmdc.drp.HelloWorldKt' } // 处理重复文件冲突 duplicatesStrategy = DuplicatesStrategy.EXCLUDE // 把所有依赖打包进Jar生成胖Jar from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // 过滤所有依赖自带的签名文件,避免签名校验冲突 exclude 'META-INF/*.SF' exclude 'META-INF/*.RSA' exclude 'META-INF/*.DSA' }
配置完成后执行Gradle的jar任务,即可在项目build/libs目录下拿到可正常运行的Jar包,无需再手动配置IDEA Artifact。
内容的提问来源于stack exchange,提问作者hollo1996
相关产品推荐
相关产品推荐

