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

构建含依赖的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

  1. 在项目A的build.gradle.kts中添加适配Kotlin 1.6的Shadow插件版本:
plugins {
    kotlin("jvm") version "1.6.21"
    id("com.github.johnrengelman.shadow") version "7.1.2"
}
  1. 删除原来自定义的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引用方式

  1. 将项目A构建好的Uber Jar(如ProjectA-1.0-SNAPSHOT-all.jar)复制到项目B根目录下的libs文件夹(没有则新建)
  2. 修改项目B的依赖配置,指向正确的Jar路径:
dependencies {
    implementation(files("libs/ProjectA-1.0-SNAPSHOT-all.jar"))
    testImplementation(kotlin("test"))
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:01:42