Maven模块+构建单个特定模块

Bri*_*ris 345 java build-process maven-2

我有一个父项目多模块Maven项目P和三个子模块A,BC.这两个BC是战项目,都依赖于A.

我可以输入mvn compileP和拥有所有的子模块正确的编译的.当我想为特定模块执行操作时,问题就来了.

我希望能够为项目打包一个war B,但是当我从B目录运行package命令时,它会抱怨它找不到依赖项A.

我从这个问题中理解:Maven和依赖模块可能Maven并不是真的设计用于这种类型的依赖解析,但这引出了如何打包的问题B

  1. mvn package我真的想要的时候是否必须运行整个项目层次结构B

  2. 每次要打包时,是否必须将A的快照安装到本地存储库中B

A仍处于活跃开发阶段时,第二种情况并不是很有趣.

这里有什么最佳做法?

Pas*_*ent 639

这里有什么最佳做法?

使用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
Run Code Online (Sandbox Code Playgroud)

所以只需cd进入父P目录并运行:

mvn install -pl B -am
Run Code Online (Sandbox Code Playgroud)

这将构建B和B所需的模块.

请注意,如果引用的artifactId内容与目录名称不同,则需要使用冒号:

mvn install -pl :B -am
Run Code Online (Sandbox Code Playgroud)

如下所述:https://stackoverflow.com/a/26439938/480894

  • 另一个非常有用的选项是"-amd, - also-make-dependents",它根据reactor列表中的项目构建所有模块. (16认同)
  • 对于2011年访问此页面的人来说,这是更好的答案.现在对maven本身(Maven 2.1及更高版本)中的多模块有更好的支持,你不需要使用reactor插件. (13认同)
  • @Bax,使用`mvn install -pl.,parent/child,parent/child/grandchild`使用逗号分隔多个项目和.为父母pom (11认同)
  • 构建一个孙子模块怎么样? (2认同)
  • 在您引用的文档中以及一般的 Maven 中,“模块”和“项目”这两个术语是否用于相同的事物? (2认同)

Waq*_*med 9

说家长的pom.xml包含6个模块,并且你想运行一个˚F

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>
Run Code Online (Sandbox Code Playgroud)

1-CD进入父项目

 mvn --projects A,B,F --also-make clean install
Run Code Online (Sandbox Code Playgroud)

要么

mvn -pl A,B,F -am clean install
Run Code Online (Sandbox Code Playgroud)

要么

mvn -pl A,B,F -amd clean install
Run Code Online (Sandbox Code Playgroud)

注意:当您使用-am选项指定一个项目时,Maven将(直接或间接)构建指定项目所依赖的所有项目。Maven将检查项目列表,并遍历依赖树,找到它需要构建的所有项目。

虽然-am命令在多模块构建中生成特定项目所需的所有项目,但-amd--also-make-dependents选项将Maven配置为构建一个项目以及任何依赖该项目的项目。当使用--also-make-dependents时,Maven将检查反应堆中的所有项目,以找到依赖于特定项目的项目。它将自动构建那些项目,而没有其他任何事情。


vic*_*ugo 8

Maven绝对是为这种类型的依赖而设计的.

mvn package 将不会在您的本地存储库中安装任何内容,它只是打包项目并将其保留在目标文件夹中.

不要mvn install在父项目(A),这一切的子模块将被安装在您的计算机的Maven仓库,如果没有改变,你只需要编译/包的子模块(B)和Maven将已经打包和安装的依赖项恰到好处.

mvn install如果您更新了部分代码,则只需在父项目中使用a .

  • 在开发期间这将是一场噩梦,图像一旦您在子模块中进行修复,您将安装它,然后启动servlet容器.生命短暂 :( (2认同)

Ric*_*ler 7

如果您之前在项目B 上运行过mvn install,它将已安装到您的本地存储库,因此在构建程序包时,Maven可以解析依赖项.因此,只要您在每次更改时安装项目B,项目A的构建都将是最新的.

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

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

  • 有没有一种简单的方法可以保证我的目标项目的所有依赖项目都已安装?我拥有的层次结构实际上比此处描述的层次结构复杂得多,因此请记住,自从我上次更改代码以来,我是否为每个依赖项目运行了 mvn install 可能会很棘手。 (2认同)

umu*_*ing 7

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

mvn <target> -pl <MODULE> -am
Run Code Online (Sandbox Code Playgroud)
  • 使用指定模块或项目名称-pl
  • -am也是make。


Zac*_*son 6

你说你“真的只是想要B”,但这是错误的。您想要 B,但如果有任何更改(“积极开发”),您还需要更新的 A。

因此,有时您想要使用 A、B 和 C。对于这种情况,您有聚合器项目 P。对于您想要使用 A 和 B(但不想要 C)的情况,您应该创建聚合器项目 Q 。

编辑 2016:上述信息可能与 2009 年相关。截至 2016 年,我强烈建议在大多数情况下忽略这一点,并简单地使用-am-pl命令行标志,如已接受的答案中所述。如果您使用的是 v2.1 之前的 Maven 版本,请先更改它:)

  • Grmphh...那么我最终会得到与项目一样多的聚合器项目。 (2认同)

det*_*erb 5

看看我的答案Maven和依赖模块.

Maven的Reactor插件旨在应对建设项目的一部分.

您将要使用它的特定目标reactor:make.

  • 这曾经是正确的答案,但使用Maven 2.1,您不再需要使用reactor插件.看看Pascal在这个与"Advanced Reactor Options"相关的帖子中的答案 (3认同)