Gradle 能自动传递依赖,只要库正确声明 api(而非 implementation)依赖,应用端即可直接使用其导出的类型而无需重复声明——关键在于依赖传递性配置与版本对齐策略。
gradle 能自动传递依赖,只要库正确声明 `api`(而非 `implementation`)依赖,应用端即可直接使用其导出的类型而无需重复声明——关键在于依赖传递性配置与版本对齐策略。
在 Java 项目中,当你的自研库 com.company.aws-s3:1.0.0 内部依赖了 com.amazonaws:aws-java-sdk:1.12.472,而下游应用又需调用该库中暴露了 AWS SDK 类型的 API(例如返回 AmazonS3 实例或接收 PutObjectRequest 参数),此时若应用未显式声明该 SDK 依赖,编译将失败:因为 Gradle 默认不会将 implementation 依赖传递给消费者。
✅ 正确解法:在 aws-s3 库的 build.gradle 中,将面向公共 API 的依赖声明为 api:
// com.company.aws-s3/build.gradledependencies { // ✅ 改为 api:确保下游应用能“看到”并编译通过 AWS SDK 类型 api 'com.amazonaws:aws-java-sdk-s3:1.12.472' // 推荐使用细粒度模块(如 s3),而非全量 sdk // ❌ 避免使用已弃用的 aws-java-sdk(全量包),改用 aws-java-sdk-s3 等子模块}
⚠️ 注意:aws-java-sdk(v1)已于 2024 年正式进入维护模式,AWS 官方强烈推荐迁移到 AWS SDK for Java 2.x,它采用模块化设计、不可变对象和异步支持,且 api 依赖传递更清晰。
? 下游应用只需引入你的库,无需重复声明 SDK:
立即学习“Java免费学习笔记(深入)”;
// 应用的 build.gradledependencies { implementation 'com.company.aws-s3:1.0.0' // ✅ 不再需要:implementation 'com.amazonaws:aws-java-sdk-s3:1.12.472'}
Gradle 会自动解析并传递 api 依赖,使应用编译器能识别 AmazonS3、S3Object 等类型。
? 进阶建议:
configurations.all { resolutionStrategy { force 'com.amazonaws:aws-java-sdk-s3:1.12.472' failOnVersionConflict() // 构建失败时立即暴露冲突,而非静默降级 }}
? 总结:依赖不重复声明的前提,不是“省略”,而是精准控制传递性——用 api 暴露契约依赖,用 implementation 封装内部实现;配合版本锁定与模块化 SDK,才能真正实现“一处声明、全局复用”。