实战 | 使用maven 轻松重构项目

user-system拆分成:

user-web

user-service

user-dao

user-common

我们对其拆分后很有可能存在多个子项目中同时依赖某个jar包,如果使用不当可能会导致每个模块使用的版本不一样,所以想想能不能有什么方式来解决这类问题呢?

答案:能。但是得先了解两个概念:聚合和继承。

聚合

所谓的聚合就是我们如果想一次性构建多个项目模块,那我们就需要把这些项目模块进行聚合。

配置模板

<modules>    <module>项目模块一</module>    <module>项目模块二</module>    <module>项目模块三</module>    <module>项目模块...</module></modules>

使用方式

比如我们对user-web、user-service、user-dao、user-common四个项目模块进行聚合。

<modules>    <module>user-web</module>    <module>user-service</module>    <module>user-dao</module>    <module>user-common</module></modules>

注意:其中module的路径为相对路径。

这样就解决了我们项目模块的聚合,我们再来看看maven是如何来解决由于重复依赖导致版本不一样的问题。

继承

继承为了消除重复,我们把远程桌面很多相同的配置提取出来,例如:grouptId,version等 。

继承的配置

<parent>    <artifactId>maven-demo</artifactId>    <groupId>com.tian</groupId>    <version>1.0-SNAPSHOT</version></parent>

继承代码中定义属性

继承代码过程中,可以定义属性,例如:

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

访问属性的方式为${junit.version},例如:

<?xml version="1.0" encoding="UTF-8"?><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">    <parent>        <artifactId>maven-demo</artifactId>        <groupId>com.tian</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>user-web</artifactId>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <!-- 使用了parent中 junit.version -->            <version>${junit.version}</version>        </dependency>    </dependencies></project>

这样我们就可以使用到上面定义的属性junit.version=4.13.1。

父模块用dependencyManagement进行管理

由于项目模块较多,所以我们又抽象了一层,抽出一个parent来管理子项目的公共的依赖。为了项目的正确运行,必须让所有的子项目使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。

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

这样的好处是子模块可以有选择性的继承,而不需要全部继承。

这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

聚合和继承的关系

在前面我们构建多模块项目中,关系如下mavendemo就是user-web、user-service等几个模块的父项目。

父项目主要是用来配置一些公共的配置,其它三个项目再通过继承的方式拥有父项目中的配置,首先配置父项目的pom.xml,添加对项目的user-web、user-service、user-dao、user-common这四个模块进行聚合以及jar包依赖。

相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。

面试题:dependencyManagement和dependencies的区别

dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)。

IDEA中配置Maven

在使用IDEA开发时,如何将Maven配置呢?

打开IDEA,在File--->Settings。输入栏搜索:maven置我们之前安装好的maven目录、maven下面的setting.xml以及本地仓库目录。然后Apply--->OK。

我们项目对某个项目进行clean 等操作的时候,就可以直接双击Lifcycle下面的。

这样我们就把Maven集成到我们的IDEA中来了。

编译运行项目

我们可以在父项目中对所有子项目进行编译、打包等。我们就来对所有子模块进行打包。

然后在对应子项目中可以找到target目录和对应的jar包。

也可单独对某个子项目进行打包等操作。比如我们对user-common进行clean。于是,此时的user-common下的target已经被删掉,其他子项目中并没有收到影响。

IDEA中如何创建多项目模块

先创建一个user-parent的maven项目:

然后把src目录删掉,创建子项目:

来到New Module界面,选择Maven,选好自己的本地安装的JDK。next。填写子项目名称,我们这里创建一个user-web的子项目:注意这里user-web,默认是userweb,需要我们手工在两个单词之间添加横线:

点击Finish:然后在看看user-parent的pom中的内容:

已经添加了modules,同时把我们的user-web添加进去了。

同样方法,我们就可以创建更多字项目了:

再看看user-parent中的pom.xml文件内容:到这里,我们就轻轻松松的构建了我们这个大项目user-parent,该项目包括了user-web,user-service,user-dao,-user-commmon子项目。

若是新建多模块项目,安装上面的步骤就搞定了。

若是大项目拆分,我们就可以使用上面的方式先创建好自己的多模块项目,然后对应把大项目里的内容拷贝到对应模块中(需要注意此时子模块直接肯定会有相互依赖的)。

总结

通过继承,我们可以定义项目的父类项目,用于继承父项目的依赖、插件、属性等信息。聚合就是我们如果想一次性构建多个项目模块,那我们就需要对这些项目模块进行聚合。

构建多模块项目,在IDEA中使用创建Module的方式很轻松就可以创建了。在父项目中使用来管理子模块的依赖相关依赖。

对大项目进行重构时,只需要把各模块拆分出来的代码拷贝到对应子模块就可以了。

「没有天生的信心,只有不断培养的信心。」

(0)

相关推荐

  • Maven项目管理工具:Maven依赖

    Maven是一款优秀的依赖管理工具,那么什么是依赖呢? 通俗的说,如果一个Maven构建所产生的构件(例如Jar文件)被其他项目引用,那么该构件就是其他项目的依赖. 依赖声明 Maven坐标是依赖的前 ...

  • Maven 基础知识(一)工程结构

    maven工程结构分为继承和集合,通过继承可以让多个子模块共享配置在父模块中的配置信息,通过集合可以让我们在父模块执行命令时,递归的对子模块进行相同的处理. 下面以模块com.mycompany.ap ...

  • 实战 | maven 轻松重构项目

    现在是微服务盛行时代,说不准哪一天领导就会让你对一个大项目进行重构.大项目的痛点:编译慢.发布繁琐等.就像下面这张图: 真的不敢动呀,一不小心就坍塌了. 比如说我们用户系统,我们可以这么重构(这里只是 ...

  • 九大拉升途中的K线组合实战技巧,轻松掌握,快乐挣钱

    今天小编要给大家讲解的炒股技巧是,买入技巧.很多人都说,有的时候选到好的股票,却总是赚不到钱,今天小编就重点来给大家讲讲,希望你们可以重点关注下,希望你们都可以用心学习下! 一.拉升途中加速三连阳 1 ...

  • 中国式摔跤五路腿基本功练习及实战技巧,轻松摔你没商量

    中国式摔跤五路腿基本功练习及实战技巧,轻松摔你没商量

  • 「全攻略」从基础要点到实战应用,轻松掌握长铁杆!

    相比于起球困难.容错性低的长铁杆,球友们会倾向于更容易操控和掌握的中短铁杆.但其实掌握了长铁杆不仅能帮我们增加距离,还能让我们在实战中多一个选择,所以今天我们一起来学习一下长铁杆的入门基础到实战应用吧 ...

  • 高考志愿填报,200字揭密“位次法”的实战方法,轻松上大学!

    位次法难掌握吗?今天把位次法实战应用给大家揭秘,不说废话,200字以内我保证说完! 1.用今年的位次(一分一档表)对照去年的同位次,即可看到同位分 2.用同位分查找高校录取分(最高分和最低分) 3.往 ...

  • IntelliJ IDEA创建maven多模块项目(图文教程)

    项目主要分成3个模块,wms-root为父模块,wms-core和wms-app(webapp类型的模块)为子模块. 一.parent project,创建wms-root父模块. 1.依次点击:fi ...

  • &#128161;实战案例讲解轻松实现目标的3个阶段

    如果问每一个人,做营销或做生意是为了什么?他们会回答:赚钱,财务自由,实现价值! 那么怎样才能赚到钱? 答案是:成交客户! 是的!成交是所有营销中追求的过程,任何营销行为都必须以成 交为最终目的. 成 ...

  • Maven项目管理工具:Maven创建Web项目

    到目前为止,我们所接触的Maven项目的打包类型只有JAR和POM,但在现今的互联网时代,我们创建的大部分应用程序都是Web应用,在Java中Web应用的打包方式是WAR. 本节我们将介绍如何使用Ma ...

  • 单片机实战教程来啦:项目拆解为主,手把手教&接地气

    老吴是一名有着二十多年从业经验的电子工程师,设计过多款工控仪器.在研发实践中,他有着丰富的带队经验,在指导年轻队员做设计的过程中,积累了一套自己对于电子教程的心得. "我观察了很多视频网站, ...