Maven - 两个不同的根POM

9

我对Maven还不熟悉。我被分配到一个新项目,它的结构如下。

Data_Res
  |
  ---res-search
  |     |
  |     -----res-hast
  |     |       |
  |     |       ------src/main....
  |     |       |
  |     |       ------pom.xml
  |     -----res-haster
  |     |       |
  |     |       ------src/main....
  |     |       |
  |     |       ------pom.xml
  |     |
  |     ----pom.xml
  | 
  |
  ---pom.xml
  ---sonar_pom.xml

我在根pom.xml文件中没有看到模块部分,但是我在sonar_pom.xml文件中看到了模块部分。它并不包括所有子节点。一个文件夹/项目可以有两个pom文件吗?或者我们可以单独执行它们吗?

  1. 我如何解释这个问题?子模块还是单独的项目?有什么指标可以找出来吗?
  2. 我被告知在根pom上运行mvn clean install。我已经这样做了。我被要求验证其中一个子文件夹的所有依赖项是否都已提供。如何检查这些?我可以在我的主目录下的.m2文件夹中看到一些文件。
  3. 我该如何构建/打包这个项目?我将要在其中一个子文件夹中工作。我不确定它是一个单独的项目还是子模块。在这种情况下,我可以直接进入那个文件夹并从那个文件夹中运行mvn package/build(存在pom.xml文件)吗?
2个回答

13

当您执行目标(例如mvn install)时,maven会在执行的文件夹中检查pom.xml文件。如果有pom.xml文件,它将对该文件夹(即项目)执行目标,如果有任何模块提到相同的目标,则将递归执行此操作。

一个文件夹/项目可以有两个pom文件吗?

是的,您可以为一个项目拥有多个pom,但默认情况下使用的是pom.xml文件。如果要使用替代的pom文件,可以使用-f来指定替代的pom文件。例如:mvn -f sonar_pom.xml clean install,可能该pom文件用于sonar。

这意味着子模块还是单独的项目?是否有度量方法来找出?

每个项目都有一个pom.xml文件,如果父级和所有依赖项都在本地maven仓库中,则可以独立构建。

我被告知在根目录上运行mvn clean install。我做到了。然后我被要求验证一个子文件夹的所有依赖项是否已提供。如何检查这些依赖项?我可以在主目录下的.m2文件夹中看到一些文件。

要验证依赖项,请检查本地maven仓库,其默认位置为~/.m2/repository,但可以在settings.xml中更改设置。请检查~ /.m2/settings.xml文件,如果该文件不存在,则可以在<maven_home>/conf/settings.xml中找到全局设置,将其复制到~/.m2/中,然后进行覆盖,检查以下标签:<localRepository>/path/to/local/repo</localRepository>

如何构建/打包这个项目?我将在其中一个子文件夹中工作。不确定它是单独的项目还是子模块。那么,在这种情况下,我可以直接进入该文件夹并运行mvn package / ...吗?

如果您想构建/打包整个项目,只需在根目录上运行mvn package命令即可。如果要构建/打包特定的子模块,可以直接进入子模块的文件夹并运行mvn package命令。

如我之前所提到的,如果您拥有父级和所有依赖项,则可以在您的模块上执行mvn package。您可以通过以下两种方式组合获取这些内容:

  1. 使用mvn install将其安装在您的系统中或
  2. 使用远程存储库

构建自该文件夹(存在pom.xml)?


谢谢,@Karthikeyan。这对我很有帮助。有两个问题。1)我没有看到.m2/settings.xml。2)当我从子模块/项目打包时,它在依赖项上失败了。当我从子模块打包时,它是否会自动从父级中拉取所有依赖项? - Kevin Rave
@KevinRave 我已经更新了关于 settings.xml 的回答。 对于你的第二个问题,如果依赖项不存在于 Central Repo 中,则不会下载。检查哪个依赖项没有被下载,如果它不是由你开发的,则检查哪个仓库包含该 artifact 并在 settings.xml Settings Ref 中进行配置。 - seenukarthi
太棒了!谢谢!这是发生的事情。我在我被告知的文件夹上运行了mvn package。它缺少其他文件夹的依赖项。所以我进入那个文件夹并运行了mvn install,然后它要求另一个文件夹的依赖项,我进入那个文件夹并运行了mvn install,以此类推,大约有4个文件夹。我进入每个文件夹并运行mvn install。最后回到原始文件夹并运行mvn install。它奏效了。所以我的猜测是根pom没有完成工作。你怎么看?我应该像告诉我的那样运行sonar_pom.xml而不是pom.xml吗? - Kevin Rave
通常情况下,如果您正在处理多模块项目,则父POM应该将这些模块作为其子模块,可以查看此[多模块示例](http://books.sonatype.com/mvnex-book/reference/multimodule.html)以获取样例。 - seenukarthi

3
只是为了补充已经正确的答案:在eclipse中,我需要在“Maven Build”运行配置下创建一个新的“运行配置”。 我将基本目录设置为标准的 ${project_loc:connect},将“目标”字段设置为 -f pom_deploy.xml install -T 1C。然后我可以右键单击自定义pom_deploy.xml -> 运行为... -> 运行配置 -> 自定义Maven部署。 '-T 1C' 可选,并告诉 Maven 在构建/编译过程中同时使用多个处理器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接