【发布时间】:2020-03-13 12:28:51
【问题描述】:
背景
我使用 gradle 编写了一个 Spring Boot 项目,它运行良好。 我想将项目拆分为库(jar),以便我可以重用它们。
这些是要求
- 每个项目都位于同级文件夹中,每个文件夹都包含自己的 .git 存储库。
- 多构建项目应该在同级文件夹中,而不是在包含子项目的文件夹中。它还包含自己的 .git 存储库。
- 仅用作库 (jar) 的项目具有带有
@SpringBootTest注释的测试,这些测试应该可以独立运行。 - 应将用作类库的项目作为“瘦 jars”提供给其他项目,而不包括任何依赖项。使用项目需要添加它使用的所有项目累积的任何依赖项。
- 应该可以独立构建每个子项目。对于依赖套件中其他项目的项目,这意味着构建项目将使用它需要的其他项目 (jar) 的输出,如果该输出尚未准备好,gradle 将首先构建这些项目。
- 应该可以从多项目父级构建所有项目(将解决依赖关系,并且只会进行必要的构建)。
- 使用多项目构建整个套件将创建一个包含父引导 jar 及其所有依赖项的可部署文件夹。
- 我希望能够使用 Intellij 创作项目、编辑和调试上述所有内容。
最小的、可重现的示例
我在此处上传了一个最小的、可重现的示例 (reprex):https://github.com/david-sackstein/multiproject
它包含三个文件夹:
-
productcommon是一个带有公共类ProductFactory的 jar。 - productservice 是一个带有单个
@RestController的 SpringBoot 应用程序,它在其中一个方法中调用 ProductFactory 的公共方法。 productservice 对 productcommon 有项目依赖。 -
multiproject是一个 gradle 项目,没有依赖于productcommon和productservice的代码 - 我相应地在所有三个项目中设置了 build.gradle 和 settings.gradle。
当我构建 productservice 时它失败了 - 显然是因为 productcommon 的项目导入失败。
此示例中缺少什么或不正确?
【问题讨论】:
-
什么不起作用?只需创建这些库并确保未应用 spring-boot-plugin。它只是一个普通的 jar,而不是 Spring Boot 项目。话虽这么说,
@SpringBootTest也不起作用,因为它不是一个 Spring Boot 项目。 -
有很多问题。可能是因为需要做出许多决定,而我不知道该怎么做。这里有几个。 1. 哪些项目(如果有的话)应该包含一个 gradle 任务来将输出复制到某个地方 - 以及在哪里? 2. 如何指定对位于同级文件夹中的项目的依赖关系?我是否需要为此使用 settings.gradle 文件,还是应该在 gradle 文件中完成,或者两者兼而有之? 3.如何在多构建项目级别强制执行依赖顺序(它似乎按字母顺序构建 - 然后由于缺乏依赖关系而失败)。
-
为什么你需要复制一些东西,声明一个从一个项目到另一个项目的依赖关系,你应该没问题(使用
project依赖关系,如 gradle 文档中所述)。 Gradle 也计算出构建事物的顺序,或者通过将它们放入settings.gradle来强制执行它。所有这些答案都可以通过阅读 Gradle 文档找到。 -
我在哪里可以找到所有的输出? (文档很难阅读。我正在寻找一组非常基本的要求,但找不到一个可以满足上述所有要求的简单示例)。
-
我将尝试创建一个示例项目并在此处上传。
标签: spring spring-boot gradle intellij-idea gradle-multi-project-build