如今是微服务盛行时代,说不许哪一天领导就会让你对一个大项目进行重构。大项目的痛点:编译慢、发布繁琐等。就像下面这张图:web
真的不敢动呀,一不当心就坍塌了。面试
好比说咱们用户系统,咱们能够这么重构(这里只是举例,每一个项目拆分目的可能不一样)。apache
user-system拆分红:maven
user-web
user-service
user-dao
user-common
咱们对其拆分后颇有可能存在多个子项目中同时依赖某个jar包,若是使用不当可能会致使每一个模块使用的版本不同,因此想一想能不能有什么方式来解决这类问题呢?ide
答案:能。可是得先了解两个概念:聚合和继承。微服务
所谓的聚合就是咱们若是想一次性构建多个项目模块,那咱们就须要把这些项目模块进行聚合。测试
配置模板ui
<modules>
<module>项目模块一</module>
<module>项目模块二</module>
<module>项目模块三</module>
<module>项目模块...</module>
</modules>
好比咱们对user-web、user-service、user-dao、user-common四个项目模块进行聚合。spa
<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。
因为项目模块较多,因此咱们又抽象了一层,抽出一个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里的依赖都会自动引入,并默认被全部的子项目继承。
在使用IDEA开发时,如何将Maven配置呢?
打开IDEA,在File--->Settings。输入栏搜索:maven
配置咱们以前安装好的maven目录、maven下面的setting.xml以及本地仓库目录。而后Apply--->OK。
咱们项目对某个项目进行clean 等操做的时候,就能够直接双击Lifcycle下面的。
这样咱们就把Maven集成到咱们的IDEA中来了。
咱们能够在父项目中对全部子项目进行编译、打包等。咱们就来对全部子模块进行打包。
而后在对应子项目中能够找到target目录和对应的jar包。
也可单独对某个子项目进行打包等操做。好比咱们对user-common进行clean。
因而,此时的user-common下的target已经被删掉,其余子项目中并无收到影响。
先建立一个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的方式很轻松就能够建立了。在父项目中使用来管理子模块的依赖相关依赖。
对大项目进行重构时,只须要把各模块拆分出来的代码拷贝到对应子模块就能够了。
「没有天生的信心,只有不断培养的信心。」