java - API 设计:隐藏传递 API
问题描述
我正在构建一组具有固定 API 的 Android 模块,该 API 依赖于其他内部模块。Gradle 在这里引入了一个不错的(构建时)功能,将这些内部模块的依赖项分为两类:
api
- 这些模块是“API”并将它们的依赖项进一步传输到依赖项堆栈中(例如,因为它们的 API 在其他 API 中也被引用)implementation
- 这些模块是纯粹的实现细节,不是实现模块的 API 的一部分
Gradle 主要使用它来加速构建,因为如果某些模块的实现依赖发生了变化,它的 API 保持不变,因此依赖的模块不需要重新编译。这篇博文很好地总结了它。
现在,当我发布我的模块时,显然implementation
和api
依赖项都成为常规的 Maven 依赖项,因为即使是内部模块也会将内部 API 传递到仅实现外部 API 的代码。
我知道可能没有办法正确处理这个问题,我猜随着时间的推移,人们开发了不同的解决方法来应对这种情况,例如创建包含内部依赖项的“胖”库,但通过包可见性或隐藏它们之类的,但这不是我可以走的路 - 因为我的模块实际上是模块,因为它们可以而且应该单独使用(并最终相互结合),我无法处理创建胖库的复杂性“模块A+模块B”,“模块A+模块C”,同样如此。
那么,其他人如何解决这个问题呢?其他可用的解决方法是什么?我感觉缺少一个跨模块组可见性修饰符,它告诉实现代码“你只能在同一个 Maven 组中使用这个类,即使它是公共的”。
想法?
解决方案
推荐阅读
- hyperledger-fabric - Kubernetes 上的 Hyperledger Fabric 2.0 一切正常包安装提交但调用给我错误
- visual-studio-code - Visual Studio Code 在高对比度主题中选择文本颜色
- visual-foxpro - 与 vfp 的一致连接失败
- c# - 可以在不使用空间的情况下射击子弹(PictureBoxes)(例如在 Space Invaders 中),例如使用计时器?
- git - 切换分支时如何停止git自动更新?
- excel - 使用 vba 使行高从 2 到 50=118
- mysql - 如何防止通过触发器插入表?
- jenkins - 詹金斯 | DSL| 工作区目录问题
- javascript - 如何为平滑滚动添加缓动?
- python - 如何使用 asyncio 迭代阻塞迭代器?