首先,这种方法称为多模块构建,非常适合此类事情。
这是否意味着在父级 myProject 中有一些依赖项集(带有dependencyManagement)被前端和/或后端内的许多不同项目使用,例如,
对dependencyManagement 的含义存在误解。在 dependencyManagement 中定义工件意味着您可以定义 dependency 而无需在您的模块(窗口、数据库)之一中提供版本号。
dependencyManagement 的目的是在一个中心位置“管理”使用的依赖项列表(通常是多模块构建的根目录 (myProject)。
让我们从一个例子开始。您在dependencyManagement 中定义如下工件:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apiguardian</groupId>
<artifactId>apiguardian-api</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</dependencyManagement>
现在您想使用这个工件(即 jar 文件中的类)。这不会向您的项目添加依赖项。对他们都没有。
所以现在要真正使用它,您必须在您的pom.xml 文件之一中定义一个dependency。例如 window 看起来像这样:
<dependencies>
<dependency>
<groupId>org.apiguardian</groupId>
<artifactId>apiguardian-api</artifactId>
</dependency>
</dependencies>
这将起到真正的作用。这意味着在构建您的模块window 期间,此依赖项(jar 文件)将在类路径中可用,您可以编译使用该依赖项的类的类。您现在可以将此依赖项添加到您的几个模块中(请记住,不要定义版本)。
经过一段时间的开发,您希望升级此工件的版本。这可以通过简单地更改dependencyManagement 位置(仅一个位置)中的版本以及将使用该版本的所有模块轻松实现。
所以第二个误解。由 Maven(以及其他人)构建的 jar 确实不包含它的依赖项。
包含依赖项的 jar 称为 fat-jar、shaded-jar 或 jar-with-dependencies 或 executable-jar(略有不同)通常不会被创建,也不应该被用作其他人使用的依赖项.
当一些项目相互依赖时,例如 window 依赖于 database ,因为数据库是一个依赖,它被构建到 window 的 JAR 中,然后两者都将分别包含自己的
如前所述,jar 默认情况下不包含依赖项(并且永远不应该)。
如果您在多模块构建的模块之间建立依赖关系,这没问题,从技术上讲,结果是在构建和/或测试期间在类路径中找到依赖关系。
所以另一件事是关于测试依赖项,正如您已经提到的。我以 assertj 库为例。如前所述,工件本身将按照您可能已经在dependencyManagement 中猜到的方式定义。这意味着我们将这个工件添加到dependencyManagement。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.19.0</version>
</dependency>
<dependency>
<groupId>org.apiguardian</groupId>
<artifactId>apiguardian-api</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</dependencyManagement>
所以现在您想在其中一个模块中使用assertj 部分,但仅用于测试。我们增强了模块的 dependency 部分......因为我们必须编写一些看起来像这样的测试:
<dependencies>
<dependency>
<groupId>org.apiguardian</groupId>
<artifactId>apiguardian-api</artifactId>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
因此,您将在这里看到的最重要的是<scope>test</scope>。这意味着依赖项仅在单元测试期间“可见”。这意味着默认情况下测试代码位于src/test/java。所以在每个模块中你必须使用 assertj 你必须添加这个依赖项(使用范围测试)。
所以最后你想为你的前端和后端构建一个可执行的 jar。
通常的方法是创建一个单独的模块frontend-app 和backend-app,它会生成一个可执行的 jar 文件。首先你必须在frontend-app 中定义使用的模块。这看起来像这样:
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>window</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>...</groupId>
<artifactId>supplemental modules for frontend</artifactId>
</dependency>
...
</dependencies>
看到给定的版本是由占位符${project.version} 完成的,它会自动替换为项目的定义版本,这一点非常重要。 ${project.version} 的使用表明依赖是由你自己的多模块构建构建的。
这些依赖项对于有正确的模块构建顺序是绝对必要的。通过使用依赖项,Maven 可以自动确定正确的构建顺序。
当然,您必须进行配置以创建可执行 jar。这可以通过 maven-shade-plugin 或 maven-assembly-plugin (基于用例)来完成。如果这是一种 Spring Boot 项目,您应该为此目的使用 spring-boot-maven-plugin。
如果您需要在此模块中编写一些集成测试,您还必须为此添加适当的依赖项。
默认情况下,通常的模块不会生成阴影/胖 jar。通常没有理由这样做。