现在是微服务盛行时代,说不准哪一天领导就会让你对一个大项目进行重构。大项目的痛点:编译慢、发布繁琐等。就像下面这张图:

真的不敢动呀,一不小心就坍塌了。

比如说我们用户系统,我们可以这么重构(这里只是举例,每个项目拆分目的可能不同)。

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-webuser-serviceuser-daouser-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目录删掉,创建子项目:

选中user-parent项目,右键,选中New-->Module

来到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的方式很轻松就可以创建了。在父项目中使用来管理子模块的依赖相关依赖。

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

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

子项目依赖和父项目冲突_实战 | maven 轻松重构项目相关推荐

  1. 如何导出maven子项目_如何使用maven 轻松重构项目

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

  2. gradle项目 构建_使用Gradle构建Monorepo项目

    gradle项目 构建 根据Wikipedia的说法 , monorepo是一种软件开发策略,其中许多项目存储在同一资源库中. 这种策略可以快速检测到因依赖关系的更改而导致的潜在问题和破坏,并且已被许 ...

  3. java后端简历项目经历_从面试官甄别项目经验的角度,说说如何在简历中写项目经验(Java后端方向)...

    在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...

  4. scala java maven项目_IntelliJ IDEA下Maven创建Scala项目的方法步骤

    环境:IntelliJ IDEA 版本:Spark-2.2.1 Scala-2.11.0 利用 Maven 第一次创建 Scala 项目也遇到了许多坑 创建一个 Scala 的 WordCount 程 ...

  5. 项目经理7大步骤轻松跟进项目,让你带项目不再那么累

    身为项目经理,跟进需求,跟进项目是必备技能,并且经常会遇到各种问题,甚至自己都乱了阵脚,看看项目管理体系指南PMBOK吧,感觉又不接地气,离实际较远,那么如何才能更好的跟进项目呢? 项目经理从立项到产 ...

  6. python电商项目介绍_电商大数据项目-推荐系统实战(一)

    本项目是基于Spark MLLib的大数据电商推荐系统项目,使用了scala语言和java语言.基于python语言的推荐系统项目会另外写一篇博客.在阅读本博客以前,需要有以下基础: 1.linux的 ...

  7. beautifulsoup解析动态页面div未展开_实战|Python轻松实现动态网页爬虫(附详细源码)...

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.项目背景事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码)&g ...

  8. 【Java项目】java实战宠物领养系统项目

    在前几年国人的观念中,国外的宠物饲养就主要是通过领养的方式了,而国内一直都是用购买的方式进行.其实从宠物的饲养数量上来看:国内饲养宠物的人数已经比世界上任何一个国家都要多,主要因素是我国的人口基数大, ...

  9. angular搭建项目步骤_建立健康的Angular项目应采取的步骤

    angular搭建项目步骤 by Ashish Gaikwad 通过Ashish Gaikwad 建立健康的Angular项目应采取的步骤 (Steps you should take to buil ...

最新文章

  1. 大工计算机基础在线3,大工16秋《计算机应用基础》在线测试3-满分100分.pdf
  2. 编译有哪些阶段,动态链接和静态链接的区别 c++
  3. Web开发中的相对路径和绝对路径
  4. 为何互联网大厂热衷于春节撒红包?谁才是最大赢家?
  5. python 对象的异或运算符_python的运算符
  6. linux就业技术指导,学linux前景怎么样
  7. docker多个容器一起打包_如何链接多个Docker容器并封装结果?
  8. 拉格朗日乘子法的通俗理解
  9. matlab中modred,计算机仿真技术(中南大学)3系统模型及转换.ppt
  10. 反向题在测试问卷信效度_检验问卷的信度和效度
  11. netd模块工作流程
  12. EPLAN中的edz文件的用法
  13. python怎么将字母排序_请教如何用python按字母顺序排序英文名字但是不可以用sort函数...
  14. Analog circuit----电路耦合、有源/无源滤波电路
  15. Quartus Primer 17.0 下载和安装
  16. C语言模拟银行排队叫号(顺序队)
  17. Websocket安装说明
  18. python读取文件并打印_Python3.4如何读取一个文件并打印
  19. shell编程——Shell条件判断之字符串判断
  20. 33种语言的中文名称、本地名称、英文名称

热门文章

  1. linux内核启动后门,Linux内核模块入门之简单内核后门
  2. nodejs redis 过期时间_别在为Redis面试而烦恼了?看完暴答【面试管】
  3. 20220211-CTF-MISC-006-pure_color(stegsolve工具的使用)-007-Aesop_secret(AES解密)
  4. 牛客练习赛46 A 华华教奕奕写几何 (简单数学)
  5. HDU4417 Super Mario 主席树
  6. C# Find() 与 FindAll()方法的使用
  7. 四则运算 结对编程
  8. fir.im Weekly - 1000 个 Android 开源项目集合
  9. c++ 门面模式(Facade)
  10. 无法打开登录所请求的数据库DbName 。登录失败。 用户 'IIS APPPOOL\DefaultAppPool' 登录失败。 的解决方案...