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

时间:2017-03-20 10:08:40

标签: java api naming-conventions packages versioning

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

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

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

我正在寻找一种通用方法,而不仅仅是针对REST的特定方法,因为我已经遇到了WebService,REST和CORBA的消费者实现。而且我不确定,工件版本(如maven)在这里运行良好,因为它与实现的版本有关,而不是API。

我知道围绕api versioning存在问题,但这些问题与生产者有关,而不是消费者。

1 个答案:

答案 0 :(得分:1)

是的,Java包名称有一个强大而模糊的约定,用于指示依赖项的版本:不要

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

在任何情况下,当类使用特定的API版本时,类和包名称都没有公开此信息的业务,这会违反封装,除了其他任何内容。这些名称有不同的目的。

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

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

相关问题