我有一个多模块Maven项目,它有一个父项目P和三个子模块a、B和C。B和C都是战争项目,都依赖于a。

我可以在P中键入mvn compile,并正确编译所有子模块。当我想对特定模块进行操作时,问题就来了。

我希望能够为项目B打包一场战争,但是当我从B的目录运行package命令时,它抱怨无法找到a的依赖项。

我从这个问题中了解到:Maven和依赖模块可能Maven并不是为这种类型的依赖解决而设计的,但这引出了如何打包B的问题?

当我真的只想要B时,我必须为整个项目层次结构运行mvn包吗? 每当我想要打包B时,我必须将A的快照安装到本地存储库中吗?

当A仍处于积极开发阶段时,第二种情况就不那么有趣了。

这里有什么最佳实践吗?


当前回答

这里有什么最佳实践吗?

使用Maven先进的反应堆选项,更具体地说:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

所以只要cd到父目录P,然后运行:

mvn install -pl B -am

这样就可以构建B和B所需的模块。

注意,如果你引用的artifactId与目录名不同,你需要使用冒号:

mvn install -pl :B -am

如下所述:

定义将在Maven多项目构建中构建的模块列表

其他回答

编译、打包、清理特定模块使用以下命令:

mvn <target> -pl <MODULE> -am

使用-pl指定模块或项目名称 -am也是make。

Maven就是为这种类型的依赖而设计的。

MVN包不会在您的本地存储库中安装任何东西,它只是打包项目并将其留在目标文件夹中。

在父项目(A)中安装mvn,这样所有的子模块都将安装在你的计算机的Maven存储库中,如果没有任何更改,你只需要编译/打包子模块(B), Maven将采用已经打包和安装的依赖项。

如果你更新了部分代码,你只需要在父项目中安装mvn。

如果您之前在项目B上运行了mvn install,那么它将被安装到您的本地存储库中,因此当您构建包A时,Maven可以解决依赖关系。因此,只要您安装项目B,每次更改它,您的项目A的构建将是最新的。

您可以使用聚合器pom定义一个多模块项目,以构建一组项目。

值得一提的是m2eclipse,它将Maven集成到Eclipse中,并允许您(可选地)从工作空间解析依赖项。因此,如果您正在处理多个项目,那么工作区内容将用于编译。一旦对更改感到满意,运行mvn install(依次在每个项目上运行,或使用聚合器),将它们放入本地存储库中。

看看我的答案Maven和相关模块。

Maven Reactor插件设计用于处理项目的构建部分。

你要用它来达到特定的目标:制造。

这里有什么最佳实践吗?

使用Maven先进的反应堆选项,更具体地说:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

所以只要cd到父目录P,然后运行:

mvn install -pl B -am

这样就可以构建B和B所需的模块。

注意,如果你引用的artifactId与目录名不同,你需要使用冒号:

mvn install -pl :B -am

如下所述:

定义将在Maven多项目构建中构建的模块列表