如何使用相互依赖的spring boot项目和JAR创建多构建gradle项目 背景

如何使用相互依赖的spring boot项目和JAR创建多构建gradle项目 背景,spring,spring-boot,gradle,intellij-idea,gradle-multi-project-build,Spring,Spring Boot,Gradle,Intellij Idea,Gradle Multi Project Build,我用gradle写了一个spring boot项目,效果很好。 我想将项目拆分为库(JAR),以便可以重用它们 这些就是要求 每个项目都位于兄弟文件夹中,每个文件夹都包含自己的.git repo 多版本项目应位于同级文件夹中,而不是包含子项目的文件夹中。它还包含自己的.git repo 仅用作库(jar)的项目具有带有@SpringBootTest注释的测试,这些测试应该可以独立运行 用作类库的项目应该作为“瘦jar”提供给其他项目,而不包括任何依赖项。正在使用的项目需要添加它所使用的所有项目累

我用gradle写了一个spring boot项目,效果很好。 我想将项目拆分为库(JAR),以便可以重用它们

这些就是要求
  • 每个项目都位于兄弟文件夹中,每个文件夹都包含自己的.git repo
  • 多版本项目应位于同级文件夹中,而不是包含子项目的文件夹中。它还包含自己的.git repo
  • 仅用作库(jar)的项目具有带有
    @SpringBootTest
    注释的测试,这些测试应该可以独立运行
  • 用作类库的项目应该作为“瘦jar”提供给其他项目,而不包括任何依赖项。正在使用的项目需要添加它所使用的所有项目累积的任何依赖项
  • 应该可以独立地构建每个子项目。对于依赖于套件中其他项目的项目,这意味着构建项目将使用它所需的其他项目(jar)的输出,如果该输出尚未准备好,gradle将首先构建这些项目
  • 应该可以从多项目父级构建所有项目(将计算出依赖项,并且只进行必要的构建)
  • 使用多项目构建整个套件将创建一个可部署文件夹,其中包含父引导jar及其所有依赖项
  • 我希望能够创作的项目,编辑和调试以上所有与Intellij
  • 最小的、可重复的示例 我在这里上传了一个最小的、可复制的示例(reprex):
    它包含三个文件夹:

  • productcommon
    是一个带有公共类的jar
    ProductFactory
  • productservice是一个SpringBoot应用程序,它有一个
    @RestController
    ,在其方法之一中调用ProductFactory的公共方法。productservice的项目依赖于productcommon
  • multiproject
    是一个渐变项目,没有依赖于
    productcommon
    productservice
  • 我在所有三个项目中相应地设置build.gradle和settings.gradle 当我构建
    productservice
    时,它失败了——显然是因为
    productcommon
    的项目导入失败了


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

    今天我看到了这篇关于这个主题的优秀文章: 汤姆·霍姆伯格

    Tom还提供了一个很好的例子:


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

    什么不起作用?只需创建这些库,并确保没有应用spring引导插件。它只是一个普通的jar,而不是springboot项目。也就是说,
    @SpringBootTest
    也不起作用,因为它不是一个springboot项目。可能是因为需要做出很多决定,而我不知道如何做。这里有一些。1.哪一个项目(如果有的话)应该包含将输出复制到某处的gradle任务?在哪里?2.如何指定同级文件夹中项目的依赖关系?我是否需要使用settings.gradle文件进行此操作,还是应该在gradle文件中进行此操作,或者两者都使用?3.我如何在多构建项目级别强制执行依赖关系顺序(它似乎是按字母顺序构建的,然后由于缺少依赖关系而失败)。为什么需要复制东西,从一个项目到另一个项目声明依赖关系,这样就可以了(使用一个
    项目
    依赖项,如gradle文档中所述)。gradle也会计算出构建事物的顺序,或者通过将它们放入
    设置中来实施。gradle
    。所有这些答案都可以通过阅读gradle文档找到。我在哪里可以找到所有输出?(文档很难阅读。我正在寻找一组非常基本的需求,但找不到一个简单的例子来实现上述所有功能)。我将尝试创建一个示例项目并上传到这里。