`
透水的鱼
  • 浏览: 1026 次
  • 性别: 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 ... 。
分享到:
评论

相关推荐

    maven分模块小demo

    本"maven分模块小demo"旨在展示如何利用Maven的多模块特性进行项目结构的组织和管理。下面将详细阐述相关知识点: 1. Maven多模块项目结构: Maven的多模块项目允许我们将大型项目分解为更小、更易于管理的部分,...

    maven模块化简单的ssh

    而"Maven模块化简单的SSH"这个标题意味着我们将探讨如何使用Maven构建工具来实现SSH(Spring、Struts和Hibernate)框架的模块化项目。 **Maven模块化** Maven是Apache软件基金会开发的一款项目管理和集成工具,它...

    maven 模块化项目demo

    Maven的“聚合”(aggregation)和“继承”(inheritance)特性使得管理大型多模块项目变得简单。聚合允许一个父POM包含多个子模块,而继承则允许子POM从父POM中继承配置,减少重复。 在“maven 模块化项目demo”中...

    【转载】Maven 模块划分

    Maven模块化的概念基于项目对象模型(POM)。每个模块都有自己的POM.xml文件,其中包含了项目的信息、依赖、构建过程等配置。通过在POM中声明子模块,我们可以把一个大项目拆分成多个独立的模块,每个模块负责特定...

    maven多模块项目(简单实例)

    本实例将详细介绍如何创建和管理一个简单的Maven多模块项目。 首先,我们要理解Maven的模块关系。在Maven中,多模块项目是由一个父模块(Parent Module)和若干子模块(Child Modules)组成。父模块主要负责定义...

    使用Maven构建多模块项目

    Maven多模块项目通常遵循一个标准的目录结构,包括一个顶级父 pom.xml(如test-hd-parent),和若干子模块,每个子模块都有自己的pom.xml。这种结构有助于保持项目的清晰和有序。 2. 顶级父POM与子模块POM: - **...

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

    在多模块开发中,Maven项目通常采用父模块(parent)和子模块(child)的结构。例如,`app-parent`这个压缩包很可能就是一个父模块项目,包含了若干个子模块的配置信息。父模块主要用于定义共有的构建配置,如版本...

    Maven模块项目。整合spring+springmvc+mybatis

    "Maven模块项目"就是这样一个示例,它演示了如何利用Maven的模块化特性,结合Spring、SpringMVC和MyBatis这三大流行Java Web开发框架进行项目整合。下面将详细介绍这些知识点。 首先,Maven是Apache软件基金会开发...

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

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

    maven多模块项目

    要创建一个Maven多模块项目,首先我们需要在`pom.xml`文件中定义项目的整体结构,包括各个模块的依赖关系。例如,一个典型的电商项目可能包含以下几个模块:`parent`(父模块),`common`(公共模块,包含共享的代码...

    maven模块化搭建 demo (增删改查)

    "Maven模块化搭建 demo"是一个基于Maven的项目结构示例,它整合了Spring框架、MyBatis持久层框架和MySQL数据库,用于展示基础的CRUD(创建、读取、更新、删除)操作。这个demo提供了一个快速启动的模板,对于初学者...

    maven多模块

    9. **持续集成(Continuous Integration, CI)**:Maven多模块项目的结构与CI服务器(如Jenkins、GitLab CI/CD等)很好地兼容,可以方便地实现自动化构建、测试和部署。 10. **版本控制**:在多模块项目中,使用...

    maven父子结构demo

    "maven父子结构demo"是一个示例项目,展示了Maven如何处理多模块项目的父子关系,使得代码组织更加有序,管理更加高效。 在Maven中,父子结构(Multi-module Project)是指一个父项目包含多个子项目。这种结构适用...

    maven多模块项目工程-已搭建好

    Maven多模块项目是一种高效、组织有序的Java项目结构,它允许开发者将大型项目分解为多个独立的、可管理的小模块,每个模块都有自己的特定功能,同时又可以协同工作。这样的结构便于代码重用、模块化开发和独立部署...

    如何提高Maven多模块项目编译速度.docx

    在开发大型Java项目时,Maven多模块结构的使用非常常见,它可以帮助我们更好地管理和组织代码。然而,当项目变得庞大时,编译速度可能会成为一个显著的问题。以下是一些优化Maven多模块项目编译速度的策略: 1. **...

    maven分模块的web工程

    ** Maven分模块Web工程详解 ** 在现代软件开发中,大型项目往往需要模块化管理,以便于代码组织、分工协作和提高复用性。Maven作为Java开发中的主流构建工具,提供了强大的模块化支持,使得我们可以将一个复杂的Web...

    maven多模块项目构建过程

    Maven多模块项目是指由一个父项目(或称为聚合项目)和若干个子项目组成的项目结构。这种结构便于代码组织,提高代码复用性,并能有效管理依赖关系。每个子项目都是独立的Maven项目,可以有自己的pom.xml配置文件,...

    maven多模块开发

    当涉及到大型或者复杂的项目时,Maven的多模块开发功能就显得尤为重要。 在“maven多模块开发”这个主题中,我们将探讨如何使用Maven来组织和管理具有多个相互依赖子项目的大型项目。多模块项目通常由一个父模块和...

    maven多模块整合

    `maven多模块整合`就是一个典型的解决策略,它允许我们将一个大型项目分解为多个独立的、可重用的模块,每个模块专注于特定的功能或组件。这样做有助于提高代码的可维护性和可扩展性,同时简化了开发和部署过程。 ...

Global site tag (gtag.js) - Google Analytics