开发依赖Exposed的Kotlin库导入项目缺类,是否需要构建fat jar?
问题根因说明
普通JAR包仅包含你自己写的代码编译产物,不会内嵌第三方依赖,也不会携带依赖元数据信息。你通过fileTree直接导入本地JAR时,Gradle无法识别该JAR的依赖列表,因此不会自动下载Exposed等第三方依赖,导致运行时类找不到。
解决方案
无需强制构建Fat Jar,优先推荐使用依赖管理体系实现需求,两种可选方案如下:
方案1:使用Maven仓库管理(优先推荐)
这是内部库迭代、分发的标准方案,完全满足只引入一个依赖的需求,不需要打Fat Jar。
库端配置
在你的Kotlin库的build.gradle.kts中新增发布配置:
plugins { kotlin("jvm") `maven-publish` // 新增Maven发布插件 } val exposedVersion: String by project dependencies { // 原有依赖配置保持不变 } // 新增发布配置 publishing { publications { create<MavenPublication>("maven") { from(components["java"]) groupId = "com.yourorg" // 替换为内部组织标识 artifactId = "your-exposed-lib" // 替换为你的库名称 version = "1.0.0" // 替换为你的库版本号 } } // 如果使用内部远程Nexus/Artifactory仓库,新增如下配置,仅用本地仓库可忽略 repositories { maven { url = uri("http://your-internal-repo/repository/maven-releases/") credentials { username = System.getenv("REPO_USER") password = System.getenv("REPO_PWD") } } } }
配置完成后执行发布命令:
- 发布到本地Maven仓库:
./gradlew publishToMavenLocal - 发布到内部远程仓库:
./gradlew publish
业务项目配置
- 先在业务项目的仓库配置中添加对应的仓库源:
repositories { mavenLocal() // 用本地仓库需要加这行 // 用内部远程仓库需要加这部分 maven { url = uri("http://your-internal-repo/repository/maven-public/") } mavenCentral() // 其他原有仓库保持不变 }
- 直接依赖你的库即可,不需要额外添加Exposed等依赖,Gradle会自动拉取所有传递依赖:
dependencies { // spring implementation("org.springframework.boot:spring-boot-starter") /** other dependencies */ implementation("com.yourorg:your-exposed-lib:1.0.0") }
方案2:构建Fat Jar(临时测试可选,不推荐长期使用)
如果不想搭建仓库,可以将所有第三方依赖打包进你的JAR中,形成可独立运行的Fat Jar,配置如下:
- 在你的Kotlin库的
build.gradle.kts中引入Shadow插件:
plugins { kotlin("jvm") id("com.github.johnrengelman.shadow") version "7.1.2" // 匹配你的Gradle版本选择对应版本 } val exposedVersion: String by project dependencies { // 原有依赖配置保持不变 } // 可选配置:避免和业务项目依赖冲突 tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar> { mergeServiceFiles() // 如果需要避免类冲突,可对依赖包重命名:relocate("org.jetbrains.exposed", "your.lib.shadow.exposed") }
- 执行
./gradlew shadowJar构建Fat Jar,生成的JAR在build/libs目录下,名称带-all后缀的就是打包了所有依赖的Fat Jar。 - 业务项目还是用原来的
fileTree导入这个Fat Jar即可,不需要额外添加其他依赖。
该方案的弊端:如果业务项目本身也引入了Exposed或者其他你打包进Fat Jar的依赖,很容易出现类冲突、版本冲突问题,排查难度高,仅适合临时测试使用。
内容的提问来源于stack exchange,提问作者GoodGoodMan
相关产品推荐
相关产品推荐

