为什么 Maven 不在多模块项目中安装依赖项?

Man*_*tel 3 java maven

我的项目结构(多模块)是这样的

parent
    projectA
    projectB
    ... other modules
Run Code Online (Sandbox Code Playgroud)

parent实际上也有一个父级(Spring Boot)。

我已经设置了一个 Jenkins 作业来对每次提交进行编译和测试,因此它运行:

mvn -f pom.xml clean install
Run Code Online (Sandbox Code Playgroud)

一切都很好。ProjectB依赖于ProjectA(类似于项目的常见类类型)并且是一个 Spring boot 应用程序。所以依赖信息是常规的:

<dependency>
        <groupId>Group</groupId>
        <artifactId>ProjectA</artifactId>
        <version>1.0-SNAPSHOT</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

ProjectBJenkins 中有一项单独的工作来构建可部署的 jar 文件并将其部署到服务器。所以命令是:

mvn -f ProjectB/pom.xml clean install antrun:run
Run Code Online (Sandbox Code Playgroud)

此操作失败并显示如下消息:

[WARNING] The POM for Group:ProjectB:1.0-SNAPSHOT is missing, no dependency information available
...
[ERROR] Failed to execute goal on project host-api: Could not resolve dependencies for project Group:ProjectB:1.0-SNAPSHOT: The following artifacts could not be resolved: Group:ProjectA:jar:1.0-SNAPSHOT...
Run Code Online (Sandbox Code Playgroud)

现在我可以通过mvn installProjectA目录中执行 a 来解决此问题 - 我已经对此进行了测试,它确实解决了问题。

但我的问题是为什么我必须这样做?Maven 不应该弄清楚它应该在本地存储库中安装 jar 吗?

提前致谢

Bor*_*der 5

TL;DR 告诉 maven 你的项目的结构。

当您运行命令时

mvn -f pom.xml clean install
Run Code Online (Sandbox Code Playgroud)

然后maven使用reactor来计算模块的顺序,输出如下:

[INFO] 反应堆构建顺序:
[INFO] ProjectA
[INFO] ProjectB

所以Maven首先构建项目A,然后构建项目B。

当您运行命令时:

mvn -f ProjectB/pom.xml clean install antrun:run
Run Code Online (Sandbox Code Playgroud)

那么你就有问题了;maven 不是从父级开始的 - 它是从子级开始的。没有告知需要首先构建的项目的层次结构。

如果您想从 Maven 多模块项目构建单个项目以及依赖项,您应该使用:

mvn -f pom.xml -pl ProjectB -am install antrun:run
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • -pl ProjectB是“项目列表”选项,它告诉maven构建这些特定的项目
  • -am是“also make”选项,它告诉maven构建项目所pl依赖的任何项目