如何使用相互依赖的 spring 引导项目和 jar 创建多构建 gradle 项目

How to create a multi-build gradle project with interdependent spring boot projects and jars

背景

我使用 gradle 编写了一个 spring 引导项目,它工作正常。 我想将项目拆分成库 (jars),以便我可以重用它们。

这些是要求

  1. 每个项目都在同级文件夹中,每个文件夹都包含自己的 .git 存储库。
  2. 多构建项目应该在兄弟文件夹中,而不是在包含子项目的文件夹中。它还包含自己的 .git 存储库。
  3. 仅用作库 (jar) 的项目有带有 @SpringBootTest 注释的测试,这些应该可以独立运行。
  4. 用作 class 库的项目应作为 "thin jars" 提供给其他项目,不包含任何依赖项。使用项目需要添加它使用的所有项目积累的任何依赖项。
  5. 应该可以独立构建每个子项目。对于依赖套件中其他项目的项目,这意味着构建项目将使用它需要的其他项目 (jar) 的输出,如果该输出未准备好,gradle 将首先构建这些项目.
  6. 应该可以从多项目父项目构建所有项目(将解决依赖关系,并且只进行必要的构建)。
  7. 使用多项目构建整个套件将创建一个包含父引导 jar 及其所有依赖项的可部署文件夹。
  8. 我希望能够使用 Intellij 编写项目、编辑和调试上述所有内容。

最小的、可重现的例子

我在此处上传了一个最小的、可重现的示例 (reprex):https://github.com/david-sackstein/multiproject
它包含三个文件夹:

  1. productcommon 是一个带有 public class ProductFactory.
  2. 的罐子
  3. productservice 是一个带有单个 @RestController 的 SpringBoot 应用程序,它在其中一个方法中调用 ProductFactory 的 public 方法。 productservice 项目依赖于 productcommon。
  4. multiproject 是一个 gradle 项目,没有依赖于 productcommonproductservice
  5. 的代码
  6. 我在所有三个项目中相应地设置了 build.gradle 和 settings.gradle。

当我构建 productservice 时它失败了 - 显然是因为 productcommon 的项目导入失败了。

这个例子中遗漏或不正确的地方是什么?

今天我看到了关于这个主题的精彩 post: https://reflectoring.io/spring-boot-gradle-multi-module 汤姆·霍姆伯格

Tom 还提供了一个很好的例子: https://github.com/thombergs/buckpal

在使用他的架构后,我可能会对这个主题有一些后续问题,但目前,我对这个解决方案很满意。