maven多模块与继承

多模块和继承主要是为了将企业实际开发中 一个非常复杂庞大的项目,进行拆分, 拆分后成为很多个模块项目,而开发团队,只需要下载对应模块项目进行开发。 实际开发中,多模块和继承往往是一起使用的 。

通常来说,在Maven的多模块工程中,都存在一个pom类型的工程作为根模块,该工程只包含一个pom.xml文件,在该文件中以模块(module)的形式声明它所包含的子模块,即多模块工程。在子模块的pom.xml文件中,又以parent的形式声明其所属的父模块,即继承。然而,这两种声明并不必同时存在,即多模块并不继承。

maven多模块与继承

多模块

  • 作用:定义一组构建模块的聚集,主要是解决项目拆分问题
  • 特点
    1. maven build父模块时会自动build子模块
    2. 父模块的打包方式(packaging)必须是POM

继承

  • 作用:复用配置,主要是解决POM复用问题
  • 子模块可任意重写父模块配置,可继承的元素如下:
    1. groupId ,artifactId,version
    2. dependencies
    3. plugins
    4. dependencyManagement
    5. pluginRepository
    6. reporting
    7. developers,contributors

下面以一个实际工程详细介绍多模块与继承的关系:

创建Maven多模块工程

  • 首先通过Maven的Archetype插件创建一个父工程,即一个pom类型的Maven工程,其中只包含一个pom.xml文件:

    mvn archetype:generate -DgroupId=com.wfyvv.mavenStart -DartifactId=mavenStart -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root -DinteractiveMode=false

    亦可在IDE中手动添加archetype,然后通过IDE创建:

    maven-archetype

  • 接下来我们创建base模块,由于base模块属于mavenStart模块,我们将工作目录切换到mavenStart目录下,创建core模块命令如下:

    mvn archetype:generate -DgroupId=com.wfyvv.mavenStart -DartifactId=base  -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

    此时,如果我们在打开父模块的pom.xml会发现,其中多了以下内容:

    <modules>
    <module>base</module>
    </modules>

    此时的module节点即是maven中的多模块,而在base模块中会多了一个parent节点:

    <parent>
    <artifactId>mavenStart</artifactId>
    <groupId>com.wfyvv.mavenStart</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>

    此时base模块将mavenStart模块为了自己的父模块,即为继承。

  • 同样,你也可以在mavenStart目录下,通过与base模块相同的方法创建web模块:

    mvn archetype:generate -DgroupId=com.wfyvv.mavenStart -DartifactId=web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

    此时父模块中会自动添加一个module

    <modules>
    <module>base</module>
    <module>web</module>
    </modules>

此时我们根据多模块的maven build父模块时会自动build子模块的特点,在mavenStart目录下执行:

mvn compile

会得到如下的一段日志信息:

[INFO] mavenStart ......................................... SUCCESS [ 0.000 s]
[INFO] base ............................................... SUCCESS [ 3.063 s]
[INFO] web ................................................ SUCCESS [ 0.016 s]

手动添加依赖关系

此时我们虽然创建了一个多模块的Maven工程,但是有两个问题我们依然没有解决:

(1)没有发挥Maven父模块的真正作用(配置共享)

(2)web模块对base模块的依赖关系尚未建立

针对(1),Maven父模块的作用本来是使子模块可以继承并覆盖父模块中的配置,比如dependency等,但是如果我们看看web和base模块中pom.xml文件,他们都声明了对Junit的依赖,而如果多个子模块都依赖于相同的类库,我们应该将这些依赖配置在父模块中,继承自父模块的子模块将自动获得这些依赖。所以接下来我们要做的便是:将web和core模块对junit的依赖删除,并将其迁移到父模块中。

对于(2),Maven在创建web模块时并不知道web依赖于core,所以这种依赖关系需要我们手动加入,在web模块的pom.xml中加入对core模块的依赖:

<dependency>
    <artifactId>base</artifactId>
    <groupId>com.wfyvv.mavenStart</groupId>
    <version>1.0-SNAPSHOT</version>
</dependency>

本文链接:

https://blog.wfyvv.com/archives/26.html
1 + 7 =
快来做第一个评论的人吧~