展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 创建包含依赖的Gradle Uber JAR及Kotlin库冲突解决方法

创建包含依赖的Gradle Uber JAR及Kotlin库冲突解决方法

本文详细介绍了如何在GradleKotlin项目中创建包含所有依赖的UberJAR(也称作“胖JAR”),并着重解决在集成此类JAR时可能遇到的Kotlin运行时库冲突问题。通过使用com.github.johnrengelman.shadow插件,并配置其排除特定Kotlin库,可以确保生成的JAR文件在其他项目中被正确识别和使用,避免IDE无法解析类的问题。

本文目录

    Gradle项目创建包含依赖的Uber JAR并解决Kotlin库冲突

    本文详细介绍了如何在Gradle Kotlin项目中创建包含所有依赖的Uber JAR(也称作“胖JAR”),并着重解决在集成此类JAR时可能遇到的Kotlin运行时库冲突问题。通过使用com.github.johnrengelman.shadow插件,并配置其排除特定Kotlin库,可以确保生成的JAR文件在其他项目中被正确识别和使用,避免IDE无法解析类的问题。

    1. 理解Uber JAR及其必要性

    在软件开发中,尤其是在需要将一个项目(例如一个库或微服务)打包成一个独立的可执行文件或易于分发的组件时,我们常常需要创建一个包含所有运行时依赖项的JAR文件,这被称为“Uber JAR”或“胖JAR”。这种打包方式简化了部署,因为所有必需的第三方库都被打包在同一个JAR中,无需额外管理依赖。

    然而,简单地通过Gradle的jar任务来合并依赖通常不足以应对复杂场景,例如处理资源文件冲突或更深层次的依赖树。更重要的是,在Kotlin项目中,如果Uber JAR包含了Kotlin运行时库,当这个JAR被另一个同样使用Kotlin的项目引用时,可能会因为类路径上存在重复或不同版本的Kotlin运行时库而导致冲突,从而出现IDE无法识别JAR内部类或运行时错误。

    2. 使用Shadow Plugin创建Uber JAR

    com.github.johnrengelman.shadow插件是Gradle生态系统中创建Uber JAR的推荐解决方案。它能够智能地处理依赖项的合并,包括重命名包以避免冲突(Shading)以及处理资源文件。

    初始配置 (Project A - 待打包项目):

    首先,在你的Kotlin项目(例如Project A)的build.gradle.kts文件中,添加Shadow插件:

    plugins {
        kotlin("jvm") version "1.6.21" // 使用你的Kotlin版本
        java // 确保java插件也已应用,shadow插件依赖它
        id("com.github.johnrengelman.shadow") version "7.1.2" // 使用最新稳定版本
    }
    
    group = "org.example"
    version = "1.0-SNAPSHOT"
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        // 你的项目依赖,例如
        implementation("org.mybatis.dynamic-sql:mybatis-dynamic-sql:1.4.1")
        testImplementation(kotlin("test"))
    }
    
    tasks.test {
        useJUnitPlatform()
    }
    
    tasks.withType {
        kotlinOptions.jvmTarget = "1.8"
    }
    
    // 配置assemble任务,使其依赖于shadowJar任务
    tasks.assemble {
        dependsOn("shadowJar")
    }

    应用此配置后,运行gradle shadowJar命令将会在build/libs目录下生成一个名为your-project-name-version-all.jar(或类似名称)的Uber JAR,其中包含了所有运行时依赖。

    3. 解决Kotlin库冲突问题

    当Project A生成的Uber JAR包含Kotlin运行时库,并且被另一个Kotlin项目(例如Project B)引用时,IDE(如IntelliJ IDEA)可能会出现无法识别JAR内部类的问题。这通常是因为Project B本身已经通过其Kotlin插件引入了Kotlin运行时库,导致类路径上存在重复的Kotlin核心类。

    为了解决这个问题,我们需要在创建Uber JAR时,明确地将Kotlin运行时相关的依赖从最终的JAR文件中排除。这样,当Project B引用这个Uber JAR时,它将使用自己已有的Kotlin运行时库,避免冲突。

    排除Kotlin库的Shadow Plugin配置 (Project A - 修正版):

    在Project A的build.gradle.kts中,添加ShadowJar任务的配置,以排除所有以"kotlin"开头的依赖:

    plugins {
        kotlin("jvm") version "1.6.21"
        java
        id("com.github.johnrengelman.shadow") version "7.1.2"
    }
    
    group = "org.example"
    version = "1.0-SNAPSHOT"
    
    repositories {
        mavenCentral()
    }
    
    tasks.assemble {
        dependsOn("shadowJar")
    }
    
    // 关键步骤:配置ShadowJar任务以排除Kotlin库
    tasks.withType {
        exclude {
            // 排除所有以"kotlin"开头的依赖,例如kotlin-stdlib, kotlin-reflect等
            it.name.startsWith("kotlin")
        }
        // 可以根据需要添加其他排除规则,例如:
        // exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA") // 排除签名文件
    }
    
    dependencies {
        implementation("org.mybatis.dynamic-sql:mybatis-dynamic-sql:1.4.1")
        testImplementation(kotlin("test"))
    }
    
    tasks.test {
        useJUnitPlatform()
    }
    
    tasks.withType {
        kotlinOptions.jvmTarget = "1.8"
    }
    
    tasks.withType {
        // 保持为空或根据需要配置
    }

    通过exclude { it.name.startsWith("kotlin") }这行配置,Shadow插件在打包时会忽略所有名称以"kotlin"开头的JAR文件,这些通常是Kotlin的标准库、反射库等运行时依赖。重新运行gradle shadowJar后,生成的Uber JAR将不再包含这些Kotlin运行时库。

    4. 在其他项目中使用Uber JAR (Project B)

    一旦Project A生成了不含内部Kotlin运行时库的Uber JAR(例如ProjectA-1.0-SNAPSHOT-all.jar),Project B就可以将其作为本地文件依赖进行引用。

    Project B 的 build.gradle.kts 配置:

    plugins {
        kotlin("jvm") version "1.6.21"
    }
    
    group = "org.example"
    version = "1.0-SNAPSHOT"
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        // 引用Project A生成的Uber JAR
        // 假设JAR文件位于Project B的src/main/resources目录下
        implementation(files("src/main/resources/ProjectA-1.0-SNAPSHOT-all.jar"))
        testImplementation(kotlin("test"))
    }
    
    tasks.test {
        useJUnitPlatform()
    }
    
    tasks.withType {
        kotlinOptions.jvmTarget = "1.8"
    }

    此时,Project B的IDE应该能够正确识别ProjectA-1.0-SNAPSHOT-all.jar中的所有类,并且由于Kotlin运行时库由Project B自身提供,不会发生冲突。

    5. 注意事项与最佳实践

    • 版本兼容性: 确保Project A(原始项目)和Project B(引用项目)使用的Kotlin版本兼容。如果Project B使用的Kotlin版本与Project A编译时使用的Kotlin版本差异过大,即使排除了Kotlin运行时库,也可能导致运行时问题。
    • 资源冲突: Shadow插件在合并JAR时会智能处理资源文件,但极端情况下仍需注意。如果两个依赖包含相同路径的资源文件,Shadow插件默认会选择第一个遇到的。
    • 发布到Maven仓库: 对于更专业的项目间依赖管理,最佳实践是将Project A发布到本地或远程Maven仓库,而不是直接引用本地JAR文件。这样Project B可以通过标准的Maven/Gradle依赖声明来引用Project A,Gradle会自动处理依赖的传递性。
    • 为什么不直接使用Gradle的jar任务合并依赖? Gradle的默认jar任务主要用于打包项目的类和资源,不直接处理其传递性依赖。虽然可以通过from(configurations.runtimeClasspath.get().map { zipTree(it) })手动合并,但这通常无法解决类路径冲突、资源文件冲突等复杂问题,而Shadow插件正是为此而生。

    总结

    创建包含所有依赖的Uber JAR是分发和部署Kotlin/Gradle项目的常见需求。com.github.johnrengelman.shadow插件提供了强大的功能来完成这项任务。然而,在Kotlin项目中,为了避免IDE无法识别类或运行时冲突,务必配置ShadowJar任务以排除Kotlin运行时相关的库。通过这种方式,可以确保生成的Uber JAR在其他Kotlin项目中能够无缝集成和正常运行。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。