新用户注册入口 老用户登录入口

Gradle打包时如何精准声明依赖并控制传递性依赖以生成包含所有依赖的fat jar

文章作者:月影清风_ 更新时间:2023-10-25 18:00:26 阅读数量:453
文章标签:Gradle打包依赖管理依赖声明传递性依赖exclude
本文摘要:在使用Gradle进行Java或Android项目打包时,确保正确包含所有依赖包是关键。首先,在`build.gradle`中通过`dependencies`块合理声明并管理直接与传递性依赖(可使用`exclude`排除特定传递依赖)。执行打包任务如`jar`时,Gradle会自动处理依赖关系,但默认不将依赖库物理打包进主`.jar`文件,仅记录于`META-INF/MANIFEST.MF`中。若需生成包含所有依赖的“fat jar”,可借助如`shadow`插件配置`shadowJar`任务实现。通过精细控制和运用Gradle依赖管理机制,开发者能高效完成项目打包并确保依赖无遗漏。
Gradle

Gradle打包时如何正确包含依赖包?

Gradle,这个强大的构建工具,在Java和Android开发领域中占据了核心地位。它以其灵活、高效的依赖管理机制深受开发者喜爱。不过呢,对于刚开始接触的新手朋友,或者在某些特定场合下,要想确保打包时把所有依赖项都准确无误地塞进去,确实可能是个挺让人头疼的小挑战。本文将带你手把手地探索Gradle这个神奇工具的依赖管理秘籍,咱们会通过实实在在的例子,一起揭秘在打包过程中如何聪明又巧妙地搞定这些依赖关系,让你彻底告别纠结和困惑。

1. 理解Gradle依赖声明

在Gradle的世界里,依赖是项目构建的基石。在`build.gradle`文件中,我们使用`dependencies`块来声明项目所需的各种依赖。例如:
dependencies {
    implementation 'com.google.guava:guava:29.0-jre' // 声明对Guava库的依赖
    testImplementation 'junit:junit:4.13' // 在测试代码中使用的JUnit依赖
}
这里的`implementation`和`testImplementation`是配置名称,它们分别表示主源码编译依赖与测试源码编译依赖。后面的字符串则是依赖的具体描述,遵循“groupId:artifactId:version”的格式。

2. 依赖传递性理解与控制

Gradle支持依赖的传递性,这意味着如果你直接依赖的库又依赖了其他库,那么那些间接依赖也会自动被包含进来。不过,在某些情况下,你可能需要控制或排除某些传递性依赖,可以使用`exclude`关键字实现:
dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-jpa') {
        exclude group: 'org.hibernate', module: 'hibernate-entitymanager'
    }
}
上述代码表示我们在引入Spring Boot Data JPA starter时,明确排除了Hibernate Entity Manager。

3. 打包时确保依赖包含无遗漏

当执行Gradle的`jar`任务(或Android的`assemble`任务)打包项目时,Gradle会自动处理所有已声明的依赖关系。一般来说,如果没啥特殊设定,那些直接用到的依赖关系会自动被塞进类路径里。而那些间接、传递过来的依赖关系,是否会被纳入其中,就得看具体的配置策略怎么安排了。
但是请注意,Gradle并不会将依赖库的`.jar`文件物理地打包进你的主`.jar`文件中,而是会在生成的`.jar`文件的`META-INF/MANIFEST.MF`文件中记录依赖信息,以供运行时解析。如果你想创建一个包含所有依赖的“fat jar”(或称为"uber jar"),可以使用如`shadow`插件或原生的`bootJar`任务(针对Spring Boot项目):
plugins {
    id 'com.github.johnrengelman.shadow' version '6.1.0'
}
jar {
    manifest {
        attributes 'Main-Class': 'com.example.Main'
    }
}
task shadowJar(type: ShadowJar) {
    archiveBaseName = 'my-app'
    archiveClassifier = 'all'
    mergeServiceFiles()
}
以上代码片段展示了如何应用Shadow插件并创建一个包含所有依赖的自包含`.jar`文件。
总结起来,要确保Gradle打包时正确包含依赖包,关键在于合理地在`build.gradle`中声明和管理依赖,并根据实际需求选择合适的打包策略。Gradle这个家伙的设计理念啊,就是让构建项目这件事儿变得瞅一眼就明白,摸一下就能灵活运用,甭管多复杂的依赖关系网,都能轻松玩转。这样一来,咱们就能麻溜地把项目打包工作给搞定了,高效又省心!在你亲自上手捣鼓和尝试Gradle的过程中,你会发现这玩意儿的强大程度绝对超乎你的想象,它会像个给力的小助手一样,陪你一起砍断开发道路上的各种难题荆棘,勇往直前地一路狂奔。
相关阅读
文章标题:Gradle构建失败详解:识别原因与有效解决之道

更新时间:2024-07-29
Gradle构建失败详解:识别原因与有效解决之道
文章标题:Gradle构建中dependencies块管理依赖包:声明、作用范围与多项目引用实践

更新时间:2023-04-22
Gradle构建中dependencies块管理依赖包:声明、作用范围与多项目引用实践
文章标题:Gradle构建变体:理解维度组合与ABI过滤,精准控制APK生成数量以符合预期

更新时间:2023-07-24
Gradle构建变体:理解维度组合与ABI过滤,精准控制APK生成数量以符合预期
文章标题:Gradle在大型项目中的构建脚本应用与依赖管理实践:灵活性、插件库及任务定义详解

更新时间:2024-01-13
Gradle在大型项目中的构建脚本应用与依赖管理实践:灵活性、插件库及任务定义详解
文章标题:Gradle任务优先级配置:在build.gradle与gradle.properties中的设置及其对编译与测试任务执行顺序的影响

更新时间:2023-09-01
Gradle任务优先级配置:在build.gradle与gradle.properties中的设置及其对编译与测试任务执行顺序的影响
文章标题:Gradle构建工具中依赖管理与打包:在build.gradle文件中正确包含依赖包及分组实践

更新时间:2023-04-09
Gradle构建工具中依赖管理与打包:在build.gradle文件中正确包含依赖包及分组实践
名词解释
作为当前文章的名词解释,仅对当前文章有效。
GradleGradle是一款基于Java的开源构建自动化工具,它使用灵活且可扩展的构建脚本语法(基于Groovy或Kotlin DSL),适用于多语言环境下的项目构建。在本文语境中,Gradle主要应用于Java和Android项目的构建过程中,以其强大的依赖管理和高效的任务执行机制帮助开发者自动管理、编译源代码以及打包项目。
依赖传递性在软件开发中,依赖传递性是指一个模块直接依赖于另一个模块时,如果被依赖模块又依赖了其他模块,则这些间接依赖会自动地、透明地传递给原始模块。在Gradle环境下,当声明一个依赖时,其所有传递性依赖也会被自动处理并包含在构建产物中,除非通过`exclude`关键字明确排除。
Fat Jar 或 Uber Jar在Java应用程序打包领域,Fat Jar(也称为Uber Jar)是一种将应用的所有依赖库与主程序类文件一起打包到同一个`.jar`文件中的方式,使得该`.jar`文件成为一个自包含的、可以在没有外部依赖的情况下独立运行的应用程序包。在Gradle中,可以通过插件如Shadow插件实现Fat Jar的生成,以简化部署和运行过程,尤其是在无须额外配置类路径环境的情况下。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在Gradle依赖管理的实际应用中,随着开源生态的快速发展和项目复杂度的提升,如何高效地管理、优化和解决依赖冲突成为开发者关注的焦点。近期,Gradle官方持续迭代更新,发布了Gradle 7.4版本,进一步强化了对依赖一致性与安全性的支持,引入了新的“dependency verification”功能,允许开发者验证项目的所有依赖是否来自预期的来源,有效防止依赖注入攻击,确保构建过程的安全可靠。
同时,为了更好地满足微服务架构下多模块项目的打包需求,社区推荐采用Gradle Composite Builds功能,它能够将多个相互依赖的项目视为一个整体进行构建,从而简化依赖管理和构建流程,提高开发效率。此外,对于Java库或应用程序,使用最新的Gradle Plug-In Portal可以便捷查找和集成适用于不同场景的高质量插件,如用于生成包含所有依赖的"fat jar"的Shadow插件,或者针对特定框架(如Spring Boot)定制的打包插件等。
深入理解并掌握Gradle依赖管理机制的同时,紧跟社区动态与技术前沿,是现代开发者提升项目构建效能、保障项目质量和安全的重要手段。通过实际操作实践,结合Gradle的最佳实践和新特性,开发者能够在面对日益复杂的项目结构和依赖关系时更加游刃有余。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
unalias alias_name - 删除已定义的别名。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
版本兼容性导致Gradle构建失败:边缘计算库依赖管理与解决方案 03-07 Kotlin:重塑编程体验 —— 简洁性、安全性与面向对象+功能性编程的融合 07-25 微服务架构下Spring Boot集成RocketMQ实现实时异步消息推送与系统高可用性 12-08 大气响应式品牌设计公司模板下载 10-14 怎么查mysql的版本号 10-03 [转载]Python:实现counting sort计数排序算法(附完整源码) 10-02 [转载]容器实践线路图 09-17 传智书城html代码 08-22 经典消毒杀菌剂采购公司HTML5网站模板 08-20 本次刷新还10个文章未展示,点击 更多查看。
[转载]激光诱导击穿光谱联合激光诱导荧光技术(LIBS-LIF)在环境监测上的元素分析应用 08-13 [转载]Android 曝光采集(商品view曝光量的统计) 07-29 SpringCloud Feign拦截器中Hystrix线程隔离下SecurityContext获取问题与解决方案 07-29 while循环中条件判断失效问题的排查与修复:布尔表达式错误、无限递归及命令执行失败解决方案 07-15 Kotlin项目中版本冲突问题的解决:依赖项管理、API兼容与编译器设置实践 06-16 Linux环境下SSH密钥对生成失败与不匹配问题:权限、服务器版本、网络因素及配置文件错误的解决方案 06-06 简洁开拓冒险工作室响应式网页模板下载 05-02 Apache Pig与Pig Latin在Hadoop生态系统中的数据处理实践:从加载到清洗,再到聚合统计与错误应对 04-30 绿色通用房屋装修工程公司网站模板 04-29 [转载]【BZOJ3238】差异,后缀数组+单调栈维护height 03-01 Solr JVM调优实践:优化堆内存、垃圾收集器与线程池参数以降低内存占用 01-02
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"