如何使用相互依赖的 spring 引导项目和 jar 创建多构建 gradle 项目
How to create a multi-build gradle project with interdependent spring boot projects and jars
背景
我使用 gradle 编写了一个 spring 引导项目,它工作正常。
我想将项目拆分成库 (jars),以便我可以重用它们。
这些是要求
- 每个项目都在同级文件夹中,每个文件夹都包含自己的 .git 存储库。
- 多构建项目应该在兄弟文件夹中,而不是在包含子项目的文件夹中。它还包含自己的 .git 存储库。
- 仅用作库 (jar) 的项目有带有
@SpringBootTest
注释的测试,这些应该可以独立运行。
- 用作 class 库的项目应作为 "thin jars" 提供给其他项目,不包含任何依赖项。使用项目需要添加它使用的所有项目积累的任何依赖项。
- 应该可以独立构建每个子项目。对于依赖套件中其他项目的项目,这意味着构建项目将使用它需要的其他项目 (jar) 的输出,如果该输出未准备好,gradle 将首先构建这些项目.
- 应该可以从多项目父项目构建所有项目(将解决依赖关系,并且只进行必要的构建)。
- 使用多项目构建整个套件将创建一个包含父引导 jar 及其所有依赖项的可部署文件夹。
- 我希望能够使用 Intellij 编写项目、编辑和调试上述所有内容。
最小的、可重现的例子
我在此处上传了一个最小的、可重现的示例 (reprex):https://github.com/david-sackstein/multiproject
它包含三个文件夹:
productcommon
是一个带有 public class ProductFactory
. 的罐子
- productservice 是一个带有单个
@RestController
的 SpringBoot 应用程序,它在其中一个方法中调用 ProductFactory 的 public 方法。 productservice 项目依赖于 productcommon。
multiproject
是一个 gradle 项目,没有依赖于 productcommon
和 productservice
的代码
- 我在所有三个项目中相应地设置了 build.gradle 和 settings.gradle。
当我构建 productservice
时它失败了 - 显然是因为 productcommon
的项目导入失败了。
这个例子中遗漏或不正确的地方是什么?
今天我看到了关于这个主题的精彩 post:
https://reflectoring.io/spring-boot-gradle-multi-module 汤姆·霍姆伯格
Tom 还提供了一个很好的例子:
https://github.com/thombergs/buckpal
在使用他的架构后,我可能会对这个主题有一些后续问题,但目前,我对这个解决方案很满意。
背景
我使用 gradle 编写了一个 spring 引导项目,它工作正常。 我想将项目拆分成库 (jars),以便我可以重用它们。
这些是要求
- 每个项目都在同级文件夹中,每个文件夹都包含自己的 .git 存储库。
- 多构建项目应该在兄弟文件夹中,而不是在包含子项目的文件夹中。它还包含自己的 .git 存储库。
- 仅用作库 (jar) 的项目有带有
@SpringBootTest
注释的测试,这些应该可以独立运行。 - 用作 class 库的项目应作为 "thin jars" 提供给其他项目,不包含任何依赖项。使用项目需要添加它使用的所有项目积累的任何依赖项。
- 应该可以独立构建每个子项目。对于依赖套件中其他项目的项目,这意味着构建项目将使用它需要的其他项目 (jar) 的输出,如果该输出未准备好,gradle 将首先构建这些项目.
- 应该可以从多项目父项目构建所有项目(将解决依赖关系,并且只进行必要的构建)。
- 使用多项目构建整个套件将创建一个包含父引导 jar 及其所有依赖项的可部署文件夹。
- 我希望能够使用 Intellij 编写项目、编辑和调试上述所有内容。
最小的、可重现的例子
我在此处上传了一个最小的、可重现的示例 (reprex):https://github.com/david-sackstein/multiproject
它包含三个文件夹:
productcommon
是一个带有 public classProductFactory
. 的罐子
- productservice 是一个带有单个
@RestController
的 SpringBoot 应用程序,它在其中一个方法中调用 ProductFactory 的 public 方法。 productservice 项目依赖于 productcommon。 multiproject
是一个 gradle 项目,没有依赖于productcommon
和productservice
的代码
- 我在所有三个项目中相应地设置了 build.gradle 和 settings.gradle。
当我构建 productservice
时它失败了 - 显然是因为 productcommon
的项目导入失败了。
这个例子中遗漏或不正确的地方是什么?
今天我看到了关于这个主题的精彩 post: https://reflectoring.io/spring-boot-gradle-multi-module 汤姆·霍姆伯格
Tom 还提供了一个很好的例子: https://github.com/thombergs/buckpal
在使用他的架构后,我可能会对这个主题有一些后续问题,但目前,我对这个解决方案很满意。