0

在我最近的项目中被介绍给 Maven 之后,在过去的几周里我一直在试验它。

我目前在我的开发环境中有一个多模块项目。项目“A”和项目“B”是项目“根”的子模块,B 依赖于 A。

我知道我可以按照此处概述的方式独立构建B。但是,我很好奇为什么我不允许从 B 的根文件夹中构建 B。mvn reactor:make...

clean install为了说明这一点,我首先通过在 A 的根目录中运行 a 来独立构建 A。但是,当我尝试从 B 的根目录执行相同操作时,Maven 报告如下错误 -

Could not find artifact org.divesh.mavenrnd:root:pom:1.0 in central

看起来 Maven 无法解析父级的 POM 文件。关于为什么会发生这种情况的任何想法?从我对Maven多模块项目的初步了解来看,将项目拆分成子模块的主要原因是为了共享依赖。但是,这不应该阻止我在其文件夹中独立构建特定模块。

谢谢。

编辑

运行mvn -N clean install以仅在代表中安装根项目的 POM。在此之后,我能够在构建和安装 A 之后成功构建 B。还有一件事我不太清楚 - 假设我已经在存储库中安装了根项目的 POM,如果我尝试构建 A,确实它是指直接在它上面的父根 POM 还是安装在存储库中的 POM?

4

2 回答 2

3

这是正确的。你提到的错误告诉你maven找不到父母的pom。

您在这里有 2 个选项:

  1. 首先调用mvn -N install你的根项目目录,将父 pom 安装到你的本地存储库。然后你可以进入B's 目录并构建子模块。
  2. <relativePath>在您的子模块 pom.xml 中指定。默认情况下,maven 只会在文件系统的上一级查找父 pom。如果您的项目中有其他目录结构,则必须指定此选项才能让 maven 找到您的父 pom。

这是一个示例:

<parent>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <relativePath>../../pom.xml</relativePath>
</parent>
于 2012-12-10T07:47:40.610 回答
1

您应该使用mvn -pl ProjectToBuild 生命周期,例如从树的根目录开始:

mvn -pl module-b package 

你不应该再使用 mvn reactor:make 了。除非您使用的是 maven 2.0

如果你不能确定一切都依赖于 module-b 的构建,你应该使用:

mvn -amd -pl module -b package

最好的方法是拥有一个代表项目适当结构的文件夹布局,并且不需要使用 relativePath。

于 2012-12-10T07:54:28.617 回答