写点什么

如何使用 maven 轻松重构项目

用户头像
田维常
关注
发布于: 2021 年 01 月 14 日

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



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


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


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


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


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


发布于: 2021 年 01 月 14 日阅读数: 22
用户头像

田维常

关注

关注公众号:Java后端技术全栈,领500G资料 2020.10.24 加入

关注公众号:Java后端技术全栈,领500G资料

评论

发布
暂无评论
如何使用maven 轻松重构项目