`
透水的鱼
  • 浏览: 970 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

简单的Maven模块结构

 
阅读更多
简单的Maven模块结构是这样的:



---- app-parent

             |-- pom.xml (pom)

             |

             |-- app-util

             |        |-- pom.xml (jar)

             |

             |-- app-dao

             |        |-- pom.xml (jar)

             |

             |-- app-service

             |        |-- pom.xml (jar)

             |

             |-- app-web

                      |-- pom.xml (war)   



上述简单示意图中,有一个父项目(app-parent)聚合很多子项目(app-util, app-dao, app-service, app-web)。每个项目,不管是父子,都含有一个pom.xml文件。而且要注意的是,小括号中标出了每个项目的打包类型。父项目是pom,也只能是pom。子项目有jar,或者war。根据它包含的内容具体考虑。



这些模块的依赖关系如下:



app-dao      --> app-util

app-service --> app-dao

app-web     --> app-service



注意依赖的传递性(大部分情况是传递的,除非你配置了特殊的依赖scope),app-dao依赖于app-util,app-service依赖于app-dao,于是app-service也依赖于app-util。同理,app-web依赖于app-dao,app-util。



用项目层次的划分替代包层次的划分能给我们带来如下好处:
1.方便重用,如果你有一个新的swing项目需要用到app-dao和app-service,添加对它们的依赖即可,你不再需要去依赖一个WAR。而有些模块,如app-util,完全可以渐渐进化成公司的一份基础工具类库,供所有项目使用。这是模块化最重要的一个目的。
2.由于你现在划分了模块,每个模块的配置都在各自的pom.xml里,不用再到一个混乱的纷繁复杂的总的POM中寻找自己的配置。
3.如果你只是在app-dao上工作,你不再需要build整个项目,只要在app-dao目录运行mvn命令进行build即可,这样可以节省时间,尤其是当项目越来越复杂,build越来越耗时后。
4.某些模块,如app-util被所有人依赖,但你不想给所有人修改,现在你完全可以从这个项目结构出来,做成另外一个项目,svn只给特定的人访问,但仍提供jar给别人使用。
5.多模块的Maven项目结构支持一些Maven的更有趣的特性(如DepencencyManagement),这留作以后讨论。

接下来讨论一下POM配置细节,实际上非常简单,先看app-parent的pom.xml:



Xml代码 复制代码 收藏代码
1.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
2.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
3.    <modelVersion>4.0.0</modelVersion> 
4.    <groupId>org.myorg.myapp</groupId> 
5.    <artifactId>app-parent</artifactId> 
6.    <packaging>pom</packaging> 
7.    <version>1.0-SNAPSHOT</version> 
8.    <modules> 
9.        <module>app-util</module> 
10.        <module>app-dao</module> 
11.        <module>app-service</module> 
12.        <module>app-web</module> 
13.    </modules> 
14.</project> 


Maven的坐标GAV(groupId, artifactId, version)在这里进行配置,这些都是必须的。特殊的地方在于,这里的packaging为pom。所有带有子模块的项目的packaging都为pom。packaging如果不进行配置,它的默认值是jar,代表Maven会将项目打成一个jar包。

该配置重要的地方在于modules,例子中包含的子模块有app-util, app-dao, app-service, app-war。在Maven build app-parent的时候,它会根据子模块的相互依赖关系整理一个build顺序,然后依次build。

这就是一个父模块大概需要的配置,接下来看一下子模块符合配置继承父模块。、



Xml代码 复制代码 收藏代码
1.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
2.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
3.    <parent> 
4.        <artifactId>app-parent</artifactId> 
5.        <groupId>org.myorg.myapp</groupId> 
6.        <version>1.0-SNAPSHOT</version> 
7.    </parent> 
8.    <modelVersion>4.0.0</modelVersion> 
9.    <artifactId>app-util</artifactId> 
10.    <dependencies> 
11.        <dependency> 
12.            <groupId>commons-lang</groupId> 
13.            <artifactId>commons-lang</artifactId> 
14.            <version>2.4</version> 
15.        </dependency> 
16.    </dependencies> 
17.</project> 


app-util模块继承了app-parent父模块,因此这个POM的一开始就声明了对app-parent的引用,该引用是通过Maven坐标GAV实现的。而关于项目app-util本身,它却没有声明完整GAV,这里我们只看到了artifactId。这个POM并没有错,groupId和version默认从父模块继承了。实际上子模块从父模块继承一切东西,包括依赖,插件配置等等。

此外app-util配置了一个对于commons-lang的简单依赖,这是最简单的依赖配置形式。大部分情况,也是通过GAV引用的。

再看一下app-dao,它也是继承于app-parent,同时依赖于app-util:



Xml代码 复制代码 收藏代码
1.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
2.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
3.    <parent> 
4.        <artifactId>app-parent</artifactId> 
5.        <groupId>org.myorg.myapp</groupId> 
6.        <version>1.0-SNAPSHOT</version> 
7.    </parent> 
8.    <modelVersion>4.0.0</modelVersion> 
9.    <artifactId>app-dao</artifactId> 
10.    <dependencies> 
11.        <dependency> 
12.            <groupId>org.myorg.myapp</groupId> 
13.            <artifactId>app-util</artifactId> 
14.            <version>${project.version}</version> 
15.        </dependency> 
16.    </dependencies> 
17.</project> 


该配置和app-util的配置几乎没什么差别,不同的地方在于,依赖变化了,app-dao依赖于app-util。这里要注意的是version的值为${project.version},这个值是一个属性引用,指向了POM的project/version的值,也就是这个POM对应的version。由于app-dao的version继承于app-parent,因此它的值就是1.0-SNAPSHOT。而app-util也继承了这个值,因此在所有这些项目中,我们做到了保持版本一致。

这里还需要注意的是,app-dao依赖于app-util,而app-util又依赖于commons-lang,根据传递性,app-dao也拥有了对于commons-lang的依赖。

app-service我们跳过不谈,它依赖于app-dao。我们最后看一下app-web:



Xml代码 复制代码 收藏代码
1.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
2.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
3.    <parent> 
4.        <artifactId>app-parent</artifactId> 
5.        <groupId>org.myorg.myapp</groupId> 
6.        <version>1.0-SNAPSHOT</version> 
7.    </parent> 
8.    <modelVersion>4.0.0</modelVersion> 
9.    <artifactId>app-web</artifactId> 
10.    <packaging>war</packaging> 
11.    <dependencies> 
12.        <dependency> 
13.            <groupId>org.myorg.myapp</groupId> 
14.            <artifactId>app-service</artifactId> 
15.            <version>${project.version}</version> 
16.        </dependency> 
17.    </dependencies> 
18.</project> 


app-web依赖于app-service,因此配置了对其的依赖。

由于app-web是我们最终要部署的应用,因此它的packaging是war。为此,你需要有一个目录src/main/webapp。并在这个目录下拥有web应用需要的文件,如/WEB-INF/web.xml。没有web.xml,Maven会报告build失败,此外你可能还会有这样一些子目录:/js, /img, /css ... 。
分享到:
评论

相关推荐

    SpringBoot + proguard+maven多模块实现代码混淆

    springboot多maven工程结构:proguard-root 是顶级父工程,proguard-modu01、proguard-mudu02是两个业务模块,proguard-server是springboot启动服务类模块,对proguard-modu01、proguard-mudu02两个模块实现proguard...

    maven简单案例源码(多模块项目)

    一个简单的maven多模块项目,包含两个模块,用来熟悉maven多项目结构比较适合

    maven创建多模块web项目.docx

    该步骤会依次生成项目的各个模块,但是生成的模块并没有 创建依赖,只是最简单的并且符合maven 要求的项目结构的模块,关于什么是 maven 的标准项目结构,可以参考 maven 官方文档,或者《 maven 权威指南》。

    maven-module多模块依赖项目在eclipse中搭建与开发

    Maven-module项目可以把较大的项目按照功能或者层次进行横向与纵向的模块化分割。项目结构是父项目-子模块的结构进行组织。整个项目以pom型项目进行组织,其模块可以是jar项目,也可以是war项目,也可以pom项目。...

    使用Maven管理进行多模块开发案例

    一,新建一个简单的Maven工程,这个Maven工程只含一个pom文件,他是管理各个模块的父级POM,如: Xml代码 &lt;packaging&gt;pom&lt;/packaging&gt; &lt;modules&gt; &lt;module&gt;app-utils&lt;/module&gt; &lt;module&gt;app-dao&lt;/module&gt; ...

    maven工程组织结构

    Maven工程分模块目录结构,参见文章http://blog.csdn.net/kandafool/article/details/6844313

    SpringCloud模块化结构demo

    这是一个maven工程,实现多模块化maven父级管理jar和打包插件,springclud+eureka的工程demo,支持打包jar命令执行

     IDEA下创建多模块maven项目1

    一、项目结构 multi-module-PRoject是主工程,里面包含两个模块(Module): web-app是应用层,用于界面展示,依赖于web-serv

    apache-maven-3.9.5-bin windows 64bit x86下载

    1、构建管理:Maven使用一个中央的配置文件(pom.xml)来定义项目的结构、依赖关系和构建脚本。通过定义项目的依赖关系,Maven能够自动下载、管理和构建这些依赖。 2、依赖管理:Maven能够自动解决项目的依赖关系,...

    maven安装过程及简单使用

    maven安装过程及简单使用 Maven介绍 Maven安装 Maven项目目录结构 Maven仓库 常用maven命令 Maven整合JavaWeb项目 Maven整合SSH 分模块构建maven项目 Maven私服

    Maven权威指南 很精典的学习教程,比ANT更好用

    一个简单的Maven项目 3.1. 简介 3.1.1. 下载本章的例子 3.2. 创建一个简单的项目 3.3. 构建一个简单的项目 3.4. 简单的项目对象模型 (Project Object Model) 3.5. 核心概念 3.5.1. Maven插件和目标 ...

    micaicms-web-modules-archetype:maven之自定义archetype生成多模块结构的项目骨架

    #micaicms-web-modules-archetypeMaven之自定义archetype生成多模块结构的基础项目骨架一:项目骨架介绍该项目骨架集成了Spring,SpringMVC,MyBatis,jsp,jquery,bootstrap等二:项目骨架使用介绍1.首先下载该...

    api-master:api-master是springMVC项目,基于maven多模块和dubbo的rpc方式整合使用

    api-master是springMVC项目,基于maven多模块依赖,采用dubbo远程调用,目前spring升级到4.3.13版本,欢迎大家提出意见,您的宝贵意见,是我们进步的动力。 项目说明 项目基于maven的多profile环境配置,打包时需要...

    demo:SpringBoot Maven 多模块项目 demo

    一、前言最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程。二、软件及硬件环境macOS Sierra 10.12.6IntelliJ IDEA 2018.2JDK 1.8Maven 3.2.1...

    maven window下安装包

    第13章:使用Maven生成项目原型/13.2 编写自己的项目原型/13.2.1 自定义项目原型结构组成 第13章:使用Maven生成项目原型/13.2 编写自己的项目原型/13.2.2 命令行生成项目原型项目 第13章:使用Maven生成项目原型/...

    Maven:构建和管理Java项目Maven:构建和管理Java项目

    maven Maven 是一种流行且功能强大的项目管理工具,主要用于构建、发布和管理 Java 项目。本文将介绍 Maven 的基本概念、核心功能和优势,以及它在项目开发中的重要作用。...解释 Maven 的模块化和标准化特点,

    multi-module-project:maven多模块项目框架

    项目结构multi-module-project是我们的项目名称,其中包含多个模块:mmp-dal模块:数据访问层,提供对原始数据(主要指数据库)的操作mmp-integration模块:提供对第三方服务的调用mmp-commons模块:提供工具类、...

    SpringBoot_MyBatisPlus_Multi:SpringBoot集成MyBatisPlus多模块Maven开发

    是SpringBoot集成MyBatisPlus 升级版的maven多模块开发项目结构wstro├──sql 项目SQL语句│ ├──App 项目启动类│├──config 配置信息│├──controller 控制器│ ├─admin 后台管理员控制器│ ├──...

    springframework体系结构及内部各模块jar之间的maven依赖关系

    很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spring依赖混乱,甚至下一次创建相同类型的工程时也不知道...

Global site tag (gtag.js) - Google Analytics