博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maven多模块项目
阅读量:6257 次
发布时间:2019-06-22

本文共 18253 字,大约阅读时间需要 60 分钟。

我们为什么要进行模块化开发?

在多人使用Maven协作开发项目时,尤其是稍微上点规模的项目,每个RD的工作都细分到具体功能和模块,有些模块甚至还要单独部署。

我们假设有这样一个商城项目,包括以下几个模块:

  • 商城前台(shop)
  • 管理后台(admin)
  • 数据库交互模块(dao)
  • 通用业务模块(service)
  • 接口模块(api)
  • 通用工具(util)

其中shop和admin需要单独部署,dao、service、util你可能想要一些经验丰富的人来维护,如果使用一个应用来管理的话,所有的功能和模块都会耦合在一起,所有人都可以随意修改代码,这显然不是我们所期望的。

而且使用一个应用来管理的话,任何一个点的代码有变更,整个项目就需要重新build,使用模块化开发的另一个好处是如果dao的代码被修改,只需要重新build dao模块就可以了。web模块可以build成war,dao、service、util等可以build成jar,只需要配置好依赖关系,就可以实现模块间的解耦合。这样的设计才是遵循“高内聚,低耦合”设计原则的。

我们如何进行模块化开发呢?

我们使用上面的例子进行演示,先进行合理的优化,我们希望dao和service作为通用的底层工具来使用,把它们合并成一个核心模块(core),build成core.jar,简单的Maven模块化项目结构如下:

---------- mall         //顶级项目   |------ pom.xml //packaging = pom |------ mall-util //通用工具 | |--- pom.xml //packaging = jar |------ mall-core //核心模块 | |--- pom.xml //packaging = jar |------ mall-web-api //接口模块 | |--- pom.xml //packaging = war |------ mall-web-admin//管理后台 | |--- pom.xml //packaging = war |------ mall-web-shop//商城前台 | |--- pom.xml //packaging = war
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这些模块中api、admin、shop均是可以单独部署的web应用,相互之间没有依赖关系,但都依赖于core模块,而core模块依赖于util模块。接下来我们按照上述确定的结构来搭建项目结构。

使用IDEA来创建Maven多模块项目

一、创建一个普通Maven项目

  1. New Project

image

  1. 填写基本信息,这里使用ipr作为项目描述文件

image

  1. 普通Maven项目不需要使用Maven模板搭建

image

二、给Maven项目添加模块

  1. New Module

image

  1. 填写基本信息,jar项目同样不需要使用Maven模板搭建

image

  1. 这个时候就可以看到,我们所添加的module已经被引入到parent的pom文件里了
com.mall
mall
pom
//打包方式为pom
1.0-SNAPSHOT
mall-util
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 变更util模块的构建方式为jar
mall
com.mall
1.0-SNAPSHOT
jar
//打包方式为jar
mall-util
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、给Maven项目添加web模块

  1. 创建一个module,并选中“Create from archetype”选项,同时maven模板选择webapp

image

  1. 接下来耐心的等待maven帮你创建好module,模块信息已经被添加
mall-util
mall-web-admin
  • 1
  • 2
  • 3
  • 4

目录结构如下:

image

pom:

mall
com.mall
1.0-SNAPSHOT
4.0.0
mall-web-admin
war
mall-web-admin
https://github.com/beiyoufx
junit
junit
3.8.1
test
mall-web-admin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

四、添加模块间的依赖关系

  1. 增加core与util的依赖

image

  1. 增加admin与core的依赖关系

image

admin与core、util的依赖链

image

多模块项目的构建与发布

打包

image

所有在root项目中进行的构建都会传递到模块中,例如root中的package会打包整个项目,当文件有变动时会进行重新聚合,其他命令同理。模块中的package只会打包当前模块。

使用source:jar命令会将源码打包。

发布

web模块可以单独部署也可聚合部署。

版权声明:本文为博主原创文章,转载请在显著位置注明出处并指明原文链接。 http://blog.csdn.net/u011404265/article/details/54891229
 
 
 
 
 
 
 

 一个多模块项目通过一个父POM 引用一个或多个子模块来定义。父项目,通过以下配置,将子项目关联。

 

[xhtml] 
 
 
  1. <packaging>pom</packaging>  
  2. <modules>  
  3.           <module>simple-weather</module>  
  4.           <module>simple-webapp</module>  
  5. </modules>  

 

     其中值得注意的是<packaging>pom</packaging>这个父项目不像之前的项目那样创建一个JAR 或者一个WAR,它仅仅是一个引用其它Maven 项目的POM。pom.xml 中下一部分列出了项目的子模块。这些模块在modules元素中定义,每个modules 元素对应了一个simple-parent/目录下的子目录。Maven知道去这些子目录寻找pom.xml 文件,并且,在构建的simp-parent 的时候,它会将这些子模块包含到要构建的项目中。

     当然,仅仅在父项目,配置子项目是不能够真正实现关联的,因为,这毕竟需要子项目的同意,故!子项目中需要配置:

 

[xhtml] 
 
 
  1. <parent>  
  2.         <groupId>org.sonatype.mavenbook.ch06</groupId>  
  3.         <artifactId>simple-parent</artifactId>  
  4.         <version>1.0</version>  
  5. </parent>  

 

     现在,通过父pom.xml将2个子项目进行了关联,那么我们需要从simple-parent 项目运行mvn clean install 命令,将2个子项目打包,编译为一个项目!

     当Maven 执行一个带有子模块的项目的时候,Maven 首先载入父POM,然后定位所有的子模块POM。Maven 然后将所有这些项目的POM 放入到一个称为Maven 反应堆(Reactor)的东西中,由它负责分析模块之间的依赖关系。这个反应堆处理组件的排序,以确保相互独立的模块能以适当的顺序被编译和安装。

     当,通过父pom.xml进行完成多个子项目的关联后,我们可以像前几章一样,分别进入某个单独的模块,进行运行,以移动程序!

 

 注意:子项目的文件,位于父项目pom.xml同级,也就是,子项目的pom.xml位于父pom.xml的下一级文件中!

 

 

 

Maven多模块项目

  Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。

  项目结构如下:

      test-hd-parent   (父级)

             ---pom.xml
             ---test-hd-api          (第三方接口层)
                    ----pom.xml    
           ---test-hd-foundation     (基础工具层)
                    ----pom.xml
             ---test-hd-resource     (资源层) 
                    ----pom.xml
             ---test-hd-service       (逻辑业务层)
                    ----pom.xml
           ---test-hd-modules     (web层)
                    ----pom.xml
                ---test-hd-www         (web模块1)
                            ----pom.xml
                ---test-hd-admin        (web模块2)
                            ----pom.xml     

创建一个父maven工程

  •   新建一个maven项目,选择存储位置,并选择创建一个简单的maven工程

    

  •   输入Group Id、Artifact Id、Packaging,packaging选择pom包

    

  •   生成父工程,pom.xml如下

    

  •   删除工程中的src 目录

    

创建子模块

  •   右击父工程名---》New---》Project,然后选择新建一个maven module工程

    

  •   设置子工程名以及父工程,再设置快速创建模式

    

  •   得到子工程(test-hd-api,第三方接口层),设置编译的jdk

    

  •   同理设置,子模块:test-hd-foundation(基础工具层)、test-hd-resource(资源层) 、test-hd-service(逻辑业务层)
  •   新建test-hd-modules (web层),选择创建一个a simple project,输入Group Id、Artifact Id、Packaging,packaging选择pom包

        

创建web子模块

  •   web子模块在建在test-hd-modules (web层)里面,右击test-hd-modules 工程名---》New---》Project,然后选择新建一个maven module工程,设置子工程名以及父工程,选择新建web项目

    

  •   配置maven web项目,参照:
  •   同理可以配置其他的web子模块   test-hd-admin(web模块2)

    

 

配置个模块的依赖

  •   在parent项目pom.xml中建立依赖管理(dependencyManagement)
    1 
    3
    4.0.0
    4
    com.hd
    5
    test-hd-parent
    6
    0.0.1-SNAPSHOT
    7
    pom
    8
    9
    test-hd-api
    10
    test-hd-service
    11
    test-hd-resource
    12
    test-hd-foundation
    13
    test-hd-modules
    14
    15 16 17
    18
    19 20
    21
    22
    23
    com.hd
    24
    test-hd-api
    25
    0.0.1-SNAPSHOT
    26
    27 28
    29
    com.hd
    30
    test-hd-service
    31
    0.0.1-SNAPSHOT
    32
    33 34
    35
    com.hd
    36
    test-hd-resource
    37
    0.0.1-SNAPSHOT
    38
    39 40
    41
    com.hd
    42
    test-hd-foundation
    43
    0.0.1-SNAPSHOT
    44
    45 46
    47
    48
    javax.servlet
    49
    javax.servlet-api
    50
    3.0.1
    51
    provided
    52
    53
    54
    javax.servlet.jsp
    55
    jsp-api
    56
    2.2
    57
    provided
    58
    59 60
    61
    62
    javax.servlet
    63
    jstl
    64
    1.2
    65
    66 67
    68
    taglibs
    69
    standard
    70
    1.1.2
    71
    72 73
    74
    junit
    75
    junit
    76
    3.8.1
    77
    test
    78
    79 80
    81
    82 83

     

  •     test-hd-foundation中的依赖
    1 
    2
    5
    4.0.0
    6
    7
    com.hd
    8
    test-hd-parent
    9
    0.0.1-SNAPSHOT
    10
    11
    test-hd-foundation
    12 13
    14 15
    16
    17
    javax.servlet
    18
    jstl
    19
    20 21
    22
    taglibs
    23
    standard
    24
    25 26
    27
    junit
    28
    junit
    29
    30
    31 32
    33
    34
    35
    36
    org.apache.maven.plugins
    37
    maven-compiler-plugin
    38
    2.3.2
    39
    40
    1.741
    1.7
    42
    43
    44
    45
    46

     

  •     test-hd-api中的依赖关系
    1 
    2
    5
    4.0.0
    6
    7
    com.hd
    8
    test-hd-parent
    9
    0.0.1-SNAPSHOT
    10
    11
    test-hd-api
    12
    13 14
    15
    com.hd
    16
    test-hd-foundation
    17
    18 19
    20
    21
    javax.servlet
    22
    jstl
    23
    24 25
    26
    taglibs
    27
    standard
    28
    29 30
    31
    junit
    32
    junit
    33
    34
    35
    36
    37
    38
    39
    org.apache.maven.plugins
    40
    maven-compiler-plugin
    41
    2.3.2
    42
    43
    1.744
    1.7
    45
    46
    47
    48
    test-hd-api
    49
    50

     

  •     test-hd-resource中的依赖关系
    1 
    2
    5
    4.0.0
    6
    7
    com.hd
    8
    test-hd-parent
    9
    0.0.1-SNAPSHOT
    10
    11
    test-hd-resource
    12
    13 14
    15
    junit
    16
    junit
    17
    18
    19 20
    21
    22
    23
    24
    org.apache.maven.plugins
    25
    maven-compiler-plugin
    26
    2.3.2
    27
    28
    1.729
    1.7
    30
    31
    32
    33
    34

     

  •     test-hd-service中的依赖关系
    1 
    2
    5
    4.0.0
    6
    7
    com.hd
    8
    test-hd-parent
    9
    0.0.1-SNAPSHOT
    10
    11
    test-hd-service
    12
    13 14
    15
    com.hd
    16
    test-hd-foundation
    17
    18 19
    20
    com.hd
    21
    test-hd-api
    22
    23 24
    25
    26
    javax.servlet
    27
    jstl
    28
    29 30
    31
    taglibs
    32
    standard
    33
    34 35
    36
    junit
    37
    junit
    38
    39
    40 41 42
    43
    44
    45
    46
    org.apache.maven.plugins
    47
    maven-compiler-plugin
    48
    2.3.2
    49
    50
    1.751
    1.7
    52
    53
    54
    55
    test-hd-service
    56
    57

     

  •   test-hd-module中的依赖关系
    1 
    2
    4
    4.0.0
    5
    6
    com.hd
    7
    test-hd-parent
    8
    0.0.1-SNAPSHOT
    9
    10 11
    test-hd-modules
    12
    pom
    13 14
    15
    test-hd-www
    16
    test-hd-admin
    17
    18 19
    20 21
    22
    com.hd
    23
    test-hd-foundation
    24
    25 26
    27
    com.hd
    28
    test-hd-service
    29
    30
    31
    com.hd
    32
    test-hd-api
    33
    34 35
    36
    com.hd
    37
    test-hd-resource
    38
    39 40
    41
    42
    javax.servlet
    43
    jstl
    44
    45 46
    47
    taglibs
    48
    standard
    49
    50 51
    52
    junit
    53
    junit
    54
    55 56
    57

     

  •     test-hd-www中的依赖关系
    1 
    2
    5
    4.0.0
    6
    7
    com.hd
    8
    test-hd-modules
    9
    0.0.1-SNAPSHOT
    10
    11
    test-hd-www
    12
    war
    13 14
    15
    16
    17
    18
    org.apache.maven.plugins
    19
    maven-compiler-plugin
    20
    2.3.2
    21
    22
    1.723
    1.7
    24
    25
    26
    27
    test-hd-www
    28
    29 30

     

  •     最后使用maven-update整个工程,右击父工程名--》Maven--》Update Project

    

打包和发布

  •   打包,右击父工程名 test-hd-parent---->Run As--->Maven Install

   

 

  •   打包web子工程,右击工程名test-hd-www--->Run As ---> Maven Build...---> Goals: clean package--->Run

      

      

 

  •   右击工程名test-hd-www,进行刷新,找到war包,放到tomcat的webapps中,启动tomcat,即可访问工程http://localhost:8080/test-hd-www

    

  •   可以去tomcat下面webapps》test-hd-www》WEB-INF》lib中,看到引用的jar包

  

你可能感兴趣的文章
ogg 、 Shareplex和DSG RealSync 对比
查看>>
NK3C程序配置
查看>>
webrtc中APM(AudioProcessing module)的使用2
查看>>
lunix的查看Tomcat目录下日志的快速操作
查看>>
zabbix添加邮件报警机制
查看>>
微信开放之模板消息
查看>>
Hql 中实用查询时候 引号的使用
查看>>
利用PowerShell复制SQLServer账户的所有权限
查看>>
SQLServer 维护脚本分享(10)索引
查看>>
js里父页面与子页面的相互调用
查看>>
AES加解密【示例】
查看>>
jdbc向各种数据库发送sql语句
查看>>
比特币进一步学习-针对作弊问题的处理
查看>>
Android实现手机摄像头的自动对焦
查看>>
ASCII流程图
查看>>
Linux知识积累(5) 关机shutdown和重启reboot
查看>>
HTML5为输入框添加语音输入功能
查看>>
[LeetCode] Find Permutation 找全排列
查看>>
os.environ() 说明
查看>>
Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
查看>>