构建含依赖的Jar后无法在其他项目访问类的问题排查
问题:无法在项目B中访问项目A构建的Jar中的类
我有一个带有依赖的应用(项目A),需要在另一个项目(项目B)中使用它。我尝试修改Jar任务来构建包含依赖的Jar,也试过使用com.github.johnrengelman.shadow插件构建uber jar,但都无法在项目B中访问ProjectA Jar里的任何类。
项目A的Gradle配置
import org.jetbrains.kotlin.com.intellij.openapi.vfs.StandardFileSystems.jar import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.6.21" } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } tasks.withType<Jar>{ from(sourceSets.main.get().output) dependsOn(configurations.runtimeClasspath) from({ duplicatesStrategy = DuplicatesStrategy.INCLUDE configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) } }) } dependencies { testImplementation(kotlin("test")) } tasks.test { useJUnitPlatform() } tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
项目B的Gradle配置
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.6.21" } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { implementation(files("src/main/resources/ProjectA-1.0-SNAPSHOT.jar")) testImplementation(kotlin("test")) } tasks.test { useJUnitPlatform() } tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" }
解决方案
一、修复项目A的Jar构建(推荐使用Shadow插件)
用Shadow插件构建正确的Uber Jar
- 在项目A的
build.gradle.kts中添加适配Kotlin 1.6的Shadow插件版本:
plugins { kotlin("jvm") version "1.6.21" id("com.github.johnrengelman.shadow") version "7.1.2" }
- 删除原来自定义的
tasks.withType<Jar>配置,Shadow插件会自动生成包含所有依赖的Uber Jar,默认输出路径为build/libs/ProjectA-1.0-SNAPSHOT-all.jar
(可选)不用Shadow插件,修复自定义Jar任务
如果坚持自己配置Jar任务,确保配置逻辑正确:
tasks.jar { // 给Uber Jar加后缀区分普通Jar archiveClassifier.set("all") // 包含项目A自身的编译输出 from(sourceSets.main.get().output) // 遍历runtimeClasspath中的Jar,解压后加入当前Jar configurations.runtimeClasspath.get().forEach { file -> if (file.isFile && file.name.endsWith(".jar")) { from(zipTree(file)) } } // 处理重复文件策略 duplicatesStrategy = DuplicatesStrategy.INCLUDE }
二、修复项目B的Jar引用方式
- 将项目A构建好的Uber Jar(如
ProjectA-1.0-SNAPSHOT-all.jar)复制到项目B根目录下的libs文件夹(没有则新建) - 修改项目B的依赖配置,指向正确的Jar路径:
dependencies { implementation(files("libs/ProjectA-1.0-SNAPSHOT-all.jar")) testImplementation(kotlin("test")) }
- 在IDE中刷新Gradle依赖,或执行
gradle build重新构建项目B
三、额外检查点
- 类访问权限:确保项目A中的类是
public修饰的,Kotlin的internal类仅在同一模块可见,无法被项目B访问 - Jar内容验证:手动解压项目A构建的Jar,检查是否包含项目A的
.class文件以及依赖库的.class文件 - JVM版本一致性:确保项目A和项目B的
kotlinOptions.jvmTarget一致(当前都是1.8),避免字节码版本不兼容问题
内容的提问来源于stack exchange,提问作者vignesh suresh
相关产品推荐
相关产品推荐

