乐趣区

关于java:如何使用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-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 的形式很轻松就能够创立了。在父我的项目中应用来治理子模块的依赖相干依赖。

对大我的项目进行重构时,只须要把各模块拆分进去的代码拷贝到对应子模块就能够了。

「没有天生的信念,只有一直造就的信念。」

举荐浏览

搞定这 24 道 JVM 面试题,要价 30k 都有底气~

京东面试:说说 MySQL 的架构体系

6000 多字 | 秒杀零碎设计留神点

退出移动版