用于版本控制外部 API 的 Java 包命名

标签 java api naming-conventions package versioning

对于如何命名包含使用外部版本化 API 的类的 Java 包是否有任何约定?

假设我们有一个服务的主要-次要语义版本控制方案,并且我们必须实现一个与该 API 的特定版本兼容并绑定(bind)到该 API 的特定版本的使用者。命名包(和类)的最佳实践是什么?

目前,我们使用的方案为:${service}_${M}_${N}(M = 主要版本,N = 次要版本)。例如:com.example.theService_1_0.。 但 sonarqube 提示它不符合惯例。 当然我可以禁用这个规则,但我想知道是否有任何最佳实践?

我正在寻找一种通用方法,而不仅仅是 REST 特定的方法,因为我遇到过 WebService、REST 和 CORBA 的消费者实现。我不确定,工件版本控制(如在 Maven 中)在这里是否有效,因为它与实现的版本有关,而不是 API 的版本。

我知道关于 api versioning 有疑问,但这些是关于生产者的,而不是消费者。

最佳答案

是的,Java 包名称有一个强烈且不明确的约定来指示依赖项的版本:

如果您将应用程序更改为使用新版本的外部 API,则您将创建新版本的应用程序。您要查找的版本号是您的应用程序的版本号。在许多 Java 项目中,依赖项的版本由 Maven 配置文件管理。

无论如何,当类使用特定的 API 版本时,类和包名称没有必要公开此信息,这会违反封装性。这些名称有不同的用途。

请注意,当您使用 HTTP/REST API 或 Java API 时,这没有什么不同。毕竟,我认为您不会将您的类命名为 TheServiceWithLog4J_12_1_5。至少我希望不会。

您没有提到您是否需要同时支持此外部 API 的多个版本。即使您这样做了,我仍然不建议在包名称中公开 API 版本号。相反,请使用包名称来指示为什么您有两个版本以及重要的区别。

关于用于版本控制外部 API 的 Java 包命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42900780/

相关文章:

java - 如何打印字符串中的每个字符?

java - 当 Activity onStop 被触发时,RecyclerView 释放 MediaPlayer

javascript - 我想在 Chart.js 中显示一个折线栏,其中的数据自动从 mockapi 获取

java - 带分页的 API 的 Stream 与 Iterator

iphone - Objective C 中 GUI 变量的命名约定

java - 将 Google Protocol Buffers 与 Java NIO 结合使用?

java - Spring启动自动配置

windows - Yii2 REST API IIS 对象已移动

visual-studio - 如何配置 Resharper 使其 "allows"在方法名称中有下划线?

wpf - 文本框员工名称与员工名称文本框