在多个 spring 引导 API 之间共享公共代码

Sharing common code between multiple spring boot APIs

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

我想要以下东西:

  1. 当我编译任何 API 时,应该编译公共模块

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

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

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

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

如果您想仔细管理重大更改,对模块进行版本控制就变得很重要,否则您可以使用 SNAPSHOTS

Maven 可以完成这个任务。

I want following things:

When I compile any of the APIs the common module should be compiled

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 的版本对于使用它的两个 apis 模块来说必须是相同的。但是,由于您想在任何 api 的每个构建中编译 common-lib,最终这是有道理的。

您可以在 want/need 时使用这种方法,使 common-lib 的版本在您的 api 之间相同。如果后来发现您的 api 使用的 common-lib 版本应该不同,因为它们没有相同的生命周期,您可以将它们解耦,如下所示。

2) 在构建方面解耦三个组件

在同一层,定义了common-lib项目,以及两个api项目,并在每个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)

I am using docker containers to run these APIs in separate dockers. How to copy the jar file for the common code into the Dockers.

你不自己复制这个库。 spring boot maven 插件会为你创建一个 fat jar,其中包含你声明的所有依赖项以及你的微服务所需的依赖项。因此,只需将 Spring Boot 创建的 jar 部署到 docker 容器上。

旁注:

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