You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发依赖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

业务项目配置

  1. 先在业务项目的仓库配置中添加对应的仓库源:
repositories {
    mavenLocal() // 用本地仓库需要加这行
    // 用内部远程仓库需要加这部分
    maven {
        url = uri("http://your-internal-repo/repository/maven-public/")
    }
    mavenCentral()
    // 其他原有仓库保持不变
}
  1. 直接依赖你的库即可,不需要额外添加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,配置如下:

  1. 在你的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")
}
  1. 执行./gradlew shadowJar构建Fat Jar,生成的JAR在build/libs目录下,名称带-all后缀的就是打包了所有依赖的Fat Jar。
  2. 业务项目还是用原来的fileTree导入这个Fat Jar即可,不需要额外添加其他依赖。

该方案的弊端:如果业务项目本身也引入了Exposed或者其他你打包进Fat Jar的依赖,很容易出现类冲突、版本冲突问题,排查难度高,仅适合临时测试使用。

内容的提问来源于stack exchange,提问作者GoodGoodMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:09:01