gpt4 book ai didi

java - Maven Java接口(interface)和实现多模块问题

转载 作者:行者123 更新时间:2023-12-05 05:19:05 25 4
gpt4 key购买 nike

假设我有一个包含 2 个模块的重用项目:api 和服务。 re-use api 模块定义了可以被其他应用程序项目使用的接口(interface)、类型、注解。重用服务模块包含真正的实现。重用项目如下所示:

pom.xml: id=reuse, group=com.test.project, version=1.0.0
|__api-module
|__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.0}, id=reuse-api
|__service-module
|__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.0}, id=reuse-srv

我们的一个应用程序依赖于重用模块。

pom.xml: id=application, group=com.test.project, version=2.0.0
dependency={scope=compile, id=reuse-api, group=com.test.project, version=1.0.0}
dependency={scope=runtime, id=reuse-srv, group=com.test.project, version=1.0.0}

问题是,如果现在我们更改重用服务模块中的某些内容,意味着我们更改重用模块的实现,则必须编译整个重用模块(api 和服务)并创建一个新的版本将被释放,因为 api 和服务模块的版本继承自父模块。新的 pom 结构将如下所示:

pom.xml: id=reuse, group=com.test.project, version=1.0.1
|__api-module
|__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.1}, id=reuse-api
|__service-module
|__pom.xml: parent={id=reuse, group=com.test.project, version=1.0.1}, id=reuse-srv

之后,应用不得不改变与新版本的依赖重新使用:

pom.xml: id=application, group=com.test.project, version=2.0.1
dependency={scope=compile, id=reuse-api, group=com.test.project, version=1.0.1}
dependency={scope=runtime, id=reuse-srv, group=com.test.project, version=1.0.1}

有没有一种方法可以使重用服务模块的修改不会对应用程序也造成更改?应用程序真的不需要受到重用实现更改的影响还是?

您有什么意见/建议吗?谢谢。

最佳答案

假设您将 2 个模块存储在某个 Artifact 存储库中(例如您公司托管的一些 repository manager)

service-api-1.0.0
service-impl-1.0.0

这些模块在多个应用程序之间共享:

app-1
compile: service-api-1.0.0
runtime: service-impl-1.0.0
app-2
compile: service-api-1.0.0
runtime: service-impl-1.0.0

应用程序应在构建配置 (additional maven repository) 中定义您的存储库,并通过版本号引用它们。

每次您在 API/实现上完成一组更改时,您应该发布一个具有更高版本的库。

库版本通常由 3 个组件组成 [major].[minor].[bugfix]

  • Bugfix 当没有新功能而只是修复现有功能时,每个版本都应该更新。
  • Minor 版本在有新功能向后兼容以前的版本时更新。
  • 主要 版本在我们引入不兼容的更改时更改。

例如在修复 service-impl-1.0.0 中的一些实现缺陷时,您将发布 service-impl-1.0.1。这个可能/应该仍然针对 service-api-1.0.0 进行编译。

这个新版本将安装在您的存储库中,然后它的内容将是

service-api-1.0.0
service-impl-1.0.0
service-impl-1.0.1

除非您更新应用程序的配置,否则它仍将根据您的存储库中仍然可用的旧版本进行编译和构建。所以你现在可以:

app-1
compile: service-api-1.0.0
runtime: service-impl-1.0.0
app-2
compile: service-api-1.0.0
runtime: service-impl-1.0.1

无需更改每个应用程序,只要它们可以访问您的库的历史 版本。仅当您想要获得新功能时才更改依赖版本(与您在 Maven Central 中对任何其他公共(public)共享库所做的方式非常相同)。

关于java - Maven Java接口(interface)和实现多模块问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46833679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com