Maven(9)——聚合继承与多模块项目

目录

一、聚合与继承

1、聚合

2、继承

二、模块划分思想

1、传统项目布局

2、多模块项目布局

三、Maven创建多模块项目

1、创建system-parent项目

2、创建sytem-domain模块

3、创建sytem-dao模块

4、创建system-service模块

5、创建system-web模块

6、编译运行项目

四、Eclipse创建Maven多模块项目

1、创建system-parent项目

2、创建sytem-domain模块

3、创建system-dao模块

4、创建system-service模块

5、创建system-web模块

6、整体目录结构:

7、编译安装system-parent

五、其他

1、标签

2、Maven反应堆


一、聚合与继承

1、聚合

在parent项目中聚合多个子模块项目:

<modules>
    <module>模块一</module>
    <module>模块二</module>
    <module>模块三</module>
</modules>

2、继承

2.1、在子模块项目中继承parent项目:

<parent>  
    <groupId>com.starfall.maven</groupId>
    <artifactId>ParentProject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../ParentProject/pom.xml</relativePath>  
</parent>
<relativePath>标签是parent项目中pom.xml文件的相对路径

2.2、父项目定义属性,子模块继承

parent项目:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>4.9</junit.version>
    <maven.version>0.0.1-SNAPSHOT</maven.version>
</properties>

子项目继承:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>  

参考:https://www.cnblogs.com/xdp-gacl/p/4058008.html

二、模块划分思想

转载:https://juvenshun.iteye.com/blog/305865

1、传统项目布局

假设有这样一个项目,很常见的Java Web应用。在这个应用中,我们分了几层:

  • Dao层负责数据库交互,封装了MyBatis、Hibernate交互的类。
  • Service层处理业务逻辑,放一些Service接口和实现相关的Bean。
  • Web层负责与客户端交互,主要有一些SpringMVC的controller或者Structs的Action类。

项目中会根据层次划分包名:

随着项目的进行,你可能会遇到如下问题:

  1. 这个应用可能需要有一个前台和一个后台管理端(web或者swing),你发现大部分dao,一些service,和大部分util是在两个应用中可。这样的问题,你一周内遇到了好几次。
  2. pom.xml中的依赖列表越来越长以重用的,但是,由于目前只有一个项目(WAR),你不得不新建一个项目依赖这个WAR,这变得非常的恶心,因为在Maven中配置对WAR的依赖远不如依赖JAR那样简单明了,而且你根本不需要org.myorg.app.web。有人修改了dao,提交到svn并且不小心导致build失败了,你在编写service的代码,发现编译不过,只能等那人把dao修复了,你才能继续进行,很多人都在修改,到后来你根本就不清楚哪个依赖是谁需要的,渐渐的,很多不必要的依赖被引入。甚至出现了一个依赖有多个版本存在。
  3. build整个项目的时间越来越长,尽管你只是一直在web层工作,但你不得不build整个项目。
  4. 某个模块,比如util,你只想让一些经验丰富的人来维护,可是,现在这种情况,每个开发者都能修改,这导致关键模块的代码质量不能达到你的要求。

我们会发现,其实这里实际上没有遵守一个设计模式原则:“高内聚,低耦合”。虽然我们通过包名划分了层次,并且你还会说,这些包的依赖都是单向的,没有包的环依赖。这很好,但还不够,因为就构建层次来说,所有东西都被耦合在一起了。因此我们需要使用Maven划分模块。

2、多模块项目布局

有一个父项目(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

用项目层次的划分替代包层次的划分能给我们带来如下好处:

  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),这留作以后讨论。

三、Maven创建多模块项目

转载:https://www.cnblogs.com/xdp-gacl/p/4242221.html

1、创建system-parent项目

命令行,输入以下命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

将src文件夹删除,然后修改pom.xml文件,将<packaging>jar</packaging>修改为<packaging>pom</packaging>,pom表示它是一个被继承的模块,修改后的内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>me.gacl</groupId>
  <artifactId>system-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>system-parent</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

2、创建sytem-domain模块

命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-domain -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

命令执行完成之后可以看到在system-parent目录中生成了system-domain,里面包含src目录和pom.xml文件。如下图所示:

同时,在system-parent目录中的pom.xml文件自动添加了如下内容:

<modules>
    <module>system-domain</module>
</modules>

修改system-domain目录中的pom.xml文件,把<groupId>me.gacl</groupId><version>1.0-SNAPSHOT</version>去掉,加上<packaging>jar</packaging>,因为groupId和version会继承system-parent中的groupId和version,packaging设置打包方式为jar

修改过后的pom.xml文件如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>me.gacl</groupId>
    <artifactId>system-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  
  <artifactId>system-domain</artifactId>
  <packaging>jar</packaging>
  
  <name>system-domain</name>
  <url>http://maven.apache.org</url>
</project>

3、创建sytem-dao模块

步骤同2

pom.xml:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>me.gacl</groupId>
    <artifactId>system-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>system-dao</artifactId>
  <packaging>jar</packaging>

  <name>system-dao</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <!--system-dao需要使用到system-domain中的类,所以需要添加对system-domain模块的依赖-->
     <dependency>
      <groupId>me.gacl</groupId>
      <artifactId>system-domain</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>

4、创建system-service模块

步骤同2

pom.xml:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>me.gacl</groupId>
    <artifactId>system-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>system-service</artifactId>
  <packaging>jar</packaging>
  
  <name>system-service</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <!--
    system-service依赖system-dao和system-domain,
    但是我们只需添加system-dao的依赖即可,因为system-dao已经依赖了system-domain
    -->
     <dependency>
      <groupId>me.gacl</groupId>
      <artifactId>system-dao</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>

5、创建system-web模块

命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

修改system-web目录中的pom.xml文件,,把<groupId>me.gacl</groupId><version>1.0-SNAPSHOT</version>去掉,因为groupId和version会继承system-parent中的groupId和version,同时添加对system-service模块的依赖,修改后的内容如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>me.gacl</groupId>
    <artifactId>system-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>system-web</artifactId>
  <packaging>war</packaging>
  
  <name>system-web Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!--
    system-web依赖system-service
    -->
     <dependency>
      <groupId>me.gacl</groupId>
      <artifactId>system-service</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>system-web</finalName>
  </build>
</project>

6、编译运行项目

命令行进入system-parent目录,然后执行下列命令:

mvn clean install

四、Eclipse创建Maven多模块项目

1、创建system-parent项目

1.1、选择Maven Project

1.2、勾选create a simple...

1.3、注意要选pom

1.4、创建好的结构如下,把src文件删除掉

2、创建sytem-domain模块

2.1、右键system-parent,选择Maven Module,勾选create a simple...

2.2、packageing,选择jar,因为这是要打包成jar给别的模块用的

2.3、观察pom.xml

system-parent

system-domain

3、创建system-dao模块

步骤同2

pom.xml需要用到system-domain依赖

4、创建system-service模块

步骤同2

pom.xml需要用到system-domain、system-dao依赖

5、创建system-web模块

步骤同2

项目需要打包为war

参考:https://blog.csdn.net/shaohe18362202126/article/details/79547621

6、整体目录结构:

            

7、编译安装system-parent

Maven会按照项目依赖的顺序对子模块逐步build。

五、其他

1、<dependencyManagement>标签

在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器的作用。

  1. 如果dependencies里的dependency自己没有声明version元素,那么maven就会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version。
  2. 如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。

在多模块项目中,parent项目使用dependencyManagement声明依赖,在子模块需要的时候对此依赖进行引入,则其他子模块就不会存在此jar。

如果parent项目中是使用<dependencies>标签声明依赖,所有的子模块都会对此依赖进行引入。

2、Maven反应堆

转载:https://juvenshun.iteye.com/blog/565240

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值