在多个Spring Boot API之间共享通用代码

时间:2019-08-06 08:27:09

标签: java maven microservices pom.xml dry

我有两个spring boot REST API,它们都有完全相同的/ health端点,我想将此端点提取到其他Java项目中。

我想要以下事情:

  1. 当我编译任何API时,应该编译通用模块

  2. 我正在使用docker容器在单独的docker中运行这些API。如何将通用代码的jar文件复制到Docker中。

如果这个问题看起来很愚蠢,请忽略,我不确定是将普通项目作为模块还是作为依赖项注入这两个项目的pom文件中。

2 个答案:

答案 0 :(得分:1)

您可以结合使用Maven和构建服务器(Jenkins等)和巧妙的管道。将您的公共依赖性作为模块,每当您在一个REST项目上启动构建时,就会发生以下情况:

  • 作为管道的一部分,开始构建您的公共依赖关系(我认为是下游工作)
  • 将最新版本部署到您的Maven存储库
  • 针对您在REST管道中的依赖关系进行maven force版本更新(使用mvn versions:use-latest-releases -Dincludes=groupId:artifactId),这将更新REST模块的pom
  • 将REST模块的最新pom推送到git

如果要认真管理重大更改,版本化模块就很重要,否则您可以摆脱SNAPSHOTS

答案 1 :(得分:1)

Maven可以完成此任务。

  

我想要以下事情:

     

当我编译任何API时,应该编译通用模块

Maven多模块pom(也称为聚合器pom)实现了这一目标。

1)在构建方面耦合三个组件


- api-parent (multimodule pom and parent pom also if needed)
   |
   |____ common-lib (jar)
   |____ api-foo (spring boot fat jar)
   |____ api-bar (spring boot fat jar)

此方法的缺点是common-lib的版本对于使用它的两个api模块必须相同。但是,由于您希望在任何api的每次构建时都编译common-lib,因此最终是有道理的。

您可以在希望/需要common-lib的版本在api之间相同时使用这种方法。如果稍后发现您的api使用的common-lib的版本应该有所不同,因为它们的生命周期不同,则可以按照以下说明对其进行解耦。

2)从构建上解耦这三个组件

在同一级别上,定义common-lib项目和两个apis项目,并在每个api项目中定义对common-lib的依赖关系。


- common-lib (jar)

- api-foo (spring boot fat jar)
   |
   |____uses___ common-lib v1 (jar)


- api-bar (spring boot fat jar)
   |
   |____uses___ common-lib v2 (jar)

  

我正在使用docker容器在单独的docker中运行这些API。   如何将通用代码的jar文件复制到Docker中。

您不会自己复制该库。 spring boot maven插件会为您创建胖子jar,该胖子jar包含您声明的所有依赖关系以及微服务所需的依赖关系。因此,只需将Spring Boot创建的jar部署在您的docker容器上即可。

旁注:

在这两种方法中,我认为您应该在同一个SCM存储库中定义这三个项目(单存储库方法而不是多存储库方法),因为这三个组件在功能上是耦合的。您可能希望同时处理所有这些内容。