Gradle子模块依赖和普通jar依赖有什么区别

浅萱酱_1254

浅萱酱_1254

2026-10-27

674人浏览

原创

project(':xxx') 将子模块纳入完整构建生命周期,需在settings.gradle中include声明,支持源码调试、依赖传递和增量编译;files('libs/xxx.jar') 仅加载二进制,无源码、无依赖解析、无自动重编译。

gradle子模块依赖和普通jar依赖有什么区别

project(':xxx') 和 files('libs/xxx.jar') 的行为完全不同

子模块依赖(project(':xxx'))让 Gradle 把另一个模块当作当前构建的一部分来参与编译、测试和打包;而本地 jar 依赖(files('libs/xxx.jar'))只是把一个已编译好的二进制包“塞进来”,Gradle 不会去读它的源码、不会触发它的编译任务,也不会感知它的内部依赖变化。

settings.gradle 是否需要 include 子模块

使用 project(':xxx') 前,必须在 settings.gradle 中用 include 显式声明该模块路径,否则 Gradle 根本找不到这个 project。而 files() 或 fileTree() 完全不依赖 settings.gradle,只要文件路径存在、拼写正确就能加载。

  • include 'common-utils' 缺失 → 报错:Project with path ':common-utils' could not be found in root project
  • files('libs/foo.jar') 路径写成 'lib/foo.jar'(少个 s)→ 编译通过但运行时 NoClassDefFoundError
  • fileTree(dir: 'libs', include: ['*.jar']) 会自动扫描整个目录,适合临时集成多个未发布 jar,但无法控制版本粒度

依赖传递性与编译期可见性差异

project(':xxx') 会完整继承被依赖模块的 api/implementation 声明:如果它用 api 暴露了 gson,那你的模块也能直接用 Gson 类,无需再声明;而 files() 加载的 jar 是“黑盒”,Gradle 不解析其 META-INF/MANIFEST.MF 或 pom,所有它依赖的类都得你手动补全,否则编译失败。

  • 子模块里写了 api 'com.google.code.gson:gson:2.10.1' → 你代码里可以直接 new Gson()
  • 你用 files('libs/common-utils-1.0.jar') → 即使这个 jar 内部用了 gson,你也得自己加一行 implementation 'com.google.code.gson:gson:2.10.1',否则编译报错
  • project() 支持断点进源码、跳转定义;files() 只能看反编译或手动 attach sources

构建生命周期和增量编译影响

改了子模块的 Java 文件,执行根项目的 ./gradlew build 会自动重新编译那个子模块,并触发依赖它的模块重编译;但改了 libs/xxx.jar 对应的源码,除非你手动重新打包并替换 jar,否则 Gradle 完全无感——它只认文件最后修改时间,不追踪源码变更。

  • 子模块启用增量编译后,改一个方法可能只重编译几十毫秒;jar 方式下,哪怕只改一个字节,也得等整个 jar 复制完成才能继续
  • CI 流水线里,project() 依赖天然支持构建缓存(build-cache),jar 依赖则容易因路径或时间戳抖动导致缓存失效
  • 调试时,子模块日志能准确定位到行号;jar 里没带 debug info 或 source mapping,堆栈全是 Unknown Source

实际项目中,子模块依赖适合长期协作、频繁迭代的内部模块;jar 依赖更适合临时对接第三方闭源 SDK、灰度验证某次构建产物,或者离线环境强制锁定二进制版本。别在同一个模块里混用两种方式指向同一逻辑——比如既 include 了 :network,又 files('libs/network-1.2.jar'),Gradle 不会报错,但 classpath 里会出现两份相同类,运行时行为不可控。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11357

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8462

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7292

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1224

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

988

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1456

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2989

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20251

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1315

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Gradle 9 主版本升级指南
Gradle 9 主版本升级指南

共0课时 | 0人学习

Gradle 安全最佳实践
Gradle 安全最佳实践

共0课时 | 0人学习

Gradle 依赖校验手册
Gradle 依赖校验手册

共0课时 | 0人学习