# Maven 2 创建主项目

**URL:** <https://www.isharkfly.com/t/maven-2/11181>\
**Category:** DevOps\
**Created:** [May 22, 2015, 7:50pm UTC](https://www.isharkfly.com/t/maven-2/11181 "2015-05-22T19:50:14Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [May 22, 2015, 7:50pm UTC](https://www.isharkfly.com/t/maven-2/11181/1 "2015-05-22T19:50:14Z")

</div>

为和这两个项目一起运行，主项目创建在比 NumOps 和 OpsImp 的项目目录高一级的目录。

NumOps 和 OpsImp 项目都使用标准 Maven 项目目录布局。

在最顶部，项目目录只包含一个 pom.xml 文件。图 8 显示了新的子目录结构，紧跟在主目录之下：

![](https://www.isharkfly.com/images/transparent.png)

可以在分发代码的 example2 子目录中找到这个多模块项目的代码（参见 下载）。清单 14 显示了顶层的 pom.xml 文件：

新代码以粗体突出显示。首先，这个主项目的工件 ID 是 mavenex2，其打包类型是 pom。这向 Maven 2 传递出这样的信号：这是一个多模块项目。

随后， 标记指定组成此项目的两个模块：NumOps 和 OpsImp。

这个主项目的子模块能从这个 pom.xml 文件中继承属性。说得更具体一点，这些子模块都不需要将 JUnit 声明为一个依赖项，即使它们都包含单元测试。这是因为它们继承了顶层定义的 JUnit 依赖项。

标记不指定此模块依赖的依赖项。相反，它主要由子模块使用。子模块能指定 标记中任何条目的依赖项，而无需指定具体的版本号。

当项目树更改依赖项的版本号时，这很有用，可以使需编辑的条目数目最小化。在本例中，OpsImp 项目的版本号是使用 ${project.version} 指定的。在执行 Maven 时，这是一个会被相应值所填充的参数。
