使用Gradle与Kotlin构建的JAR文件无法运行求助
解决Kotlin/Gradle命令行工具JAR运行时的NoClassDefFoundError问题
这个错误很典型——你的可执行JAR没有打包运行所需的Kotlin标准库及其他依赖,导致JVM在运行时找不到kotlin/jvm/internal/Intrinsics这类核心类。下面我来帮你分析原因并给出两种可行的解决方案:
问题根源
你的Gradle配置里使用了implementation来声明依赖(这是Gradle推荐的现代依赖配置),但在自定义的jar任务中,你只尝试从configurations.compile收集依赖内容。而Gradle的compile配置已经被implementation替代,implementation的依赖不会被包含在旧的compile配置里,所以最终生成的JAR里缺少了Kotlin标准库等关键依赖。
解决方案1:修复自定义jar任务
直接修改jar任务中收集依赖的配置,改用runtimeClasspath(它包含了所有运行时需要的依赖,包括implementation声明的内容):
jar { manifest { attributes "Main-Class": mainClassName } // 替换原来的configurations.compile为runtimeClasspath from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } }
修改后,重新执行./gradlew clean build生成JAR,再用java -jar build/libs/impt-1.0-SNAPSHOT.jar运行即可。
解决方案2:使用Shadow插件生成Fat Jar(更推荐)
如果想更省心地生成包含所有依赖的可执行JAR(俗称Fat Jar),可以用Shadow插件,它专门处理这类打包场景:
- 首先在
buildscript的dependencies中添加Shadow插件的classpath(选择兼容你Gradle 4.4.1的版本):
buildscript { ext.kotlin_version = '1.2.20' ext.junit_platform_version = '1.0.1' ext.junit_version = '5.0.0' ext.moshi_version = '1.5.0' ext.jna_version = '4.5.0' ext.shadow_version = '4.0.3' // 添加Shadow版本变量 repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.junit.platform:junit-platform-gradle-plugin:$junit_platform_version" classpath "com.github.jengelman.gradle.plugins:shadow:$shadow_version" // 添加Shadow插件 } }
- 应用Shadow插件:
apply plugin: 'kotlin' apply plugin: 'application' apply plugin: 'org.junit.platform.gradle.plugin' apply plugin: 'com.github.johnrengelman.shadow' // 新增这一行
- 执行
./gradlew shadowJar生成Fat Jar,生成的文件路径是build/libs/impt-1.0-SNAPSHOT-all.jar,运行这个文件即可:
java -jar build/libs/impt-1.0-SNAPSHOT-all.jar
Shadow插件会自动处理依赖打包、主类配置等细节,比自定义jar任务更稳定,尤其适合复杂项目。
内容的提问来源于stack exchange,提问作者César Alberca
相关产品推荐
相关产品推荐

