简单的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的多模块特性进行项目结构的组织和管理。下面将详细阐述相关知识点: 1. Maven多模块项目结构: Maven的多模块项目允许我们将大型项目分解为更小、更易于管理的部分,...
而"Maven模块化简单的SSH"这个标题意味着我们将探讨如何使用Maven构建工具来实现SSH(Spring、Struts和Hibernate)框架的模块化项目。 **Maven模块化** Maven是Apache软件基金会开发的一款项目管理和集成工具,它...
Maven的“聚合”(aggregation)和“继承”(inheritance)特性使得管理大型多模块项目变得简单。聚合允许一个父POM包含多个子模块,而继承则允许子POM从父POM中继承配置,减少重复。 在“maven 模块化项目demo”中...
Maven模块化的概念基于项目对象模型(POM)。每个模块都有自己的POM.xml文件,其中包含了项目的信息、依赖、构建过程等配置。通过在POM中声明子模块,我们可以把一个大项目拆分成多个独立的模块,每个模块负责特定...
本实例将详细介绍如何创建和管理一个简单的Maven多模块项目。 首先,我们要理解Maven的模块关系。在Maven中,多模块项目是由一个父模块(Parent Module)和若干子模块(Child Modules)组成。父模块主要负责定义...
Maven多模块项目通常遵循一个标准的目录结构,包括一个顶级父 pom.xml(如test-hd-parent),和若干子模块,每个子模块都有自己的pom.xml。这种结构有助于保持项目的清晰和有序。 2. 顶级父POM与子模块POM: - **...
在多模块开发中,Maven项目通常采用父模块(parent)和子模块(child)的结构。例如,`app-parent`这个压缩包很可能就是一个父模块项目,包含了若干个子模块的配置信息。父模块主要用于定义共有的构建配置,如版本...
"Maven模块项目"就是这样一个示例,它演示了如何利用Maven的模块化特性,结合Spring、SpringMVC和MyBatis这三大流行Java Web开发框架进行项目整合。下面将详细介绍这些知识点。 首先,Maven是Apache软件基金会开发...
springboot多maven工程结构:proguard-root 是顶级父工程,proguard-modu01、proguard-mudu02是两个业务模块,proguard-server是springboot启动服务类模块,对proguard-modu01、proguard-mudu02两个模块实现proguard...
要创建一个Maven多模块项目,首先我们需要在`pom.xml`文件中定义项目的整体结构,包括各个模块的依赖关系。例如,一个典型的电商项目可能包含以下几个模块:`parent`(父模块),`common`(公共模块,包含共享的代码...
"Maven模块化搭建 demo"是一个基于Maven的项目结构示例,它整合了Spring框架、MyBatis持久层框架和MySQL数据库,用于展示基础的CRUD(创建、读取、更新、删除)操作。这个demo提供了一个快速启动的模板,对于初学者...
9. **持续集成(Continuous Integration, CI)**:Maven多模块项目的结构与CI服务器(如Jenkins、GitLab CI/CD等)很好地兼容,可以方便地实现自动化构建、测试和部署。 10. **版本控制**:在多模块项目中,使用...
"maven父子结构demo"是一个示例项目,展示了Maven如何处理多模块项目的父子关系,使得代码组织更加有序,管理更加高效。 在Maven中,父子结构(Multi-module Project)是指一个父项目包含多个子项目。这种结构适用...
Maven多模块项目是一种高效、组织有序的Java项目结构,它允许开发者将大型项目分解为多个独立的、可管理的小模块,每个模块都有自己的特定功能,同时又可以协同工作。这样的结构便于代码重用、模块化开发和独立部署...
在开发大型Java项目时,Maven多模块结构的使用非常常见,它可以帮助我们更好地管理和组织代码。然而,当项目变得庞大时,编译速度可能会成为一个显著的问题。以下是一些优化Maven多模块项目编译速度的策略: 1. **...
** Maven分模块Web工程详解 ** 在现代软件开发中,大型项目往往需要模块化管理,以便于代码组织、分工协作和提高复用性。Maven作为Java开发中的主流构建工具,提供了强大的模块化支持,使得我们可以将一个复杂的Web...
Maven多模块项目是指由一个父项目(或称为聚合项目)和若干个子项目组成的项目结构。这种结构便于代码组织,提高代码复用性,并能有效管理依赖关系。每个子项目都是独立的Maven项目,可以有自己的pom.xml配置文件,...
当涉及到大型或者复杂的项目时,Maven的多模块开发功能就显得尤为重要。 在“maven多模块开发”这个主题中,我们将探讨如何使用Maven来组织和管理具有多个相互依赖子项目的大型项目。多模块项目通常由一个父模块和...
`maven多模块整合`就是一个典型的解决策略,它允许我们将一个大型项目分解为多个独立的、可重用的模块,每个模块专注于特定的功能或组件。这样做有助于提高代码的可维护性和可扩展性,同时简化了开发和部署过程。 ...