Spring Boot 多模块项目建立与配置 (一)

最近在负责的是一个比较复杂项目,模块不少,代码中的二级模块就有9个,部分二级模块下面还分了多个模块。代码中的多模块是用maven管理的,每一个模块都使用spring boot框架。以前有零零散散学过一些maven多模块配置的知识,但没本身从头至尾建立和配置过,也快忘得差很少了。此次正好对照着这个项目,动手实践一下,下面咱们就开始吧。html

maven多模块项目一般由一个父模块和若干个子模块构成,每一个模块都对应着一个pom.xml。它们之间经过继承和聚合(也称做多模块)相互关联。多模块适用于一些比较大的项目,经过合理的模块拆分,实现代码的复用,便于维护和管理。java

1 多模块项目建立

由于本系列的下一篇是《Spring Boot集成Dubbo》,因此本章就以建立多模块的dubbo项目做为示例。示例中的开发环境是Win 7,编辑器是Intellij IDEA,Java版本是1.8。web

1.1 父模块建立

首先咱们在IDEA中建立一个spring boot工程做为父项目。spring

1、在界面左上角选择File->New->Project后,选择Spring Initializr,默认使用的Java版本是1.8。
apache

avatar

2、点击Next,进入下一步,能够设置项目的一些基本信息。tomcat

这里咱们先来温习下groupId、artifactId、package这三个参数的通常填写规范。springboot

groupId和artifactId统称为“坐标”,是为了保证项目惟一性而提出的。groupId是项目组织惟一的标识符,实际对应JAVA的包的结构,ArtifactID是项目的惟一的标识符,实际对应项目的名称,就是项目根目录的名称。groupId通常分为多个段,通常第一段为域,第二段为公司名称。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org,公司名称是apache,artifactId是tomcat。包结构package最好是以groupId.artifactId打头的。框架

由于后续打算将“代码学习和实践”写成一个系列的文章,文中演示的工程都做为该工程的子模块,因此这里项目名Name就填写CodeLearnAndPractice。maven

这里是我的练习的项目,不涉及公司名,但groupId、artifactId、package参数的填写,仍是尽可能按照上面的规范来填写,这里package就直接用groupId.artifactId。以下所示:编辑器

avatar

3、点击Next,进入下一个选择dependency的界面,做用是在pom中自动添加一些依赖,在项目开始时就下载。这里咱们暂时不勾选任何依赖。

4、点击Next,进入下一个界面,填写工程名,并选择工程所在目录。填写完成后,点击Finish,便可建立一个spring boot项目。

avatar

1.2 建立子模块

在上面建立好的CodeLearnAndPractice工程名上,点击右键,选择New–>Module,进入New Module页面。

该模块为dubbo服务的提供方,Name为springboot-dubbo-server,后面其余的参数均可参照父模块的参数设置。

avatar

下面建立另外一个Module,dubbo服务的调用方,Name为springboot-dubbo-client,其余参数设置参照上步。

avatar

以上3个模块建立完成以后,整个项目的目录结构以下图所示。

咱们把下图选中的无用的文件及文件夹删掉,包括三个模块的mvnw、mvnw.cmd文件及.mvn文件夹,还有父模块的src目录,由于此处的父模块只作依赖管理,不须要编写代码。

avatar

到这里,一个父模块和两个子模块都建立完成啦~~

2 多模块项目配置

2.1 父模块pom配置

父pom是为了抽取统一的配置信息和依赖版本控制,方便子pom直接引用,简化子pom的配置。

下面介绍下父pom的配置中须要注意的一些地方。我贴出的pom看起来会有点冗余,由于其中一些不须要的地方,我没有直接删掉而是注释掉,并加了说明,是为了后续查看的时候还能清楚删掉的缘由。

一、父模块的打包类型

多模块项目中,父模块打包类型必须是pom,同时以给出全部的子模块,其中每一个module,都是另一个maven项目。

咱们的项目中目前一共有两个子模块,springboot-dubbo-server和springboot-dubbo-client。后续新增的子模块也必须加到父pom的modules中。

二、继承设置

继承是maven中很强大的一种功能,继承可使子pom得到parent中的各项配置,对子pom进行统一的配置和依赖管理。父pom中的大多数元素都能被子pom继承,想深刻了解的同窗可自行搜索学习~~

maven项目之间的继承关系经过表示。这里使用的开发框架是spring boot,默认继承spring-boot-starter-parent。

三、使用dependencyManagement管理依赖版本号

通常在项目最顶层的父pom中使用该元素,让全部子模块引用一个依赖而不用显式的列出版本号。maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,而后它就会使用在这个dependencyManagement元素中指定的版本号。

四、使用properties控制依赖包的版本号,便于版本维护

在properties标签中,添加各依赖包的版本号,而后在dependency中直接引用该依赖版本号的值便可。

CodeLearnAndPractice/pom.xml

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.practice</groupId>
    <artifactId>CodeLearnAndPractice</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!--<packaging>jar</packaging>-->
    <packaging>pom</packaging>  <!--父模块打包类型必须为pom-->

    <modules>
        <module>springboot-dubbo-server</module>
        <module>springboot-dubbo-client</module>
    </modules>

    <name>CodeLearnAndPractice</name>
    <description>Practice the learned code</description>

    <!-- parent指明继承关系,给出被继承的父项目的具体信息-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <!-- 在properties中统一控制依赖包的版本,更清晰-->
        <dubbo.version>2.5.3</dubbo.version>
        <zkclient.version>0.10</zkclient.version>
    </properties>

    <dependencyManagement>   <!--dependencyManagement用于管理依赖版本号-->
        <dependencies>
            <!-- 删除spring-boot-starter和spring-boot-starter-test,
            由于parent中继承的祖先中已经有了,而且通常dependencyManagement管理的依赖都要写版本号 -->
            <!--<dependency>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-starter</artifactId>-->
            <!--</dependency>-->

            <!--<dependency>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-starter-test</artifactId>-->
                <!--<scope>test</scope>-->
            <!--</dependency>-->

            <!--新增后续dubbo项目中所需依赖,dubbo、zk-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <!--<version>2.5.3</version>-->    <!--使用properties中配置的版本号-->
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <!--<version>0.10</version>-->    <!--使用properties中配置的版本号-->
                <version>${zkclient.version}</version>
            </dependency>
        </dependencies>

    </dependencyManagement>

    <!--该插件做用是打一个可运行的包,必需要写在须要打包的项目里。这里的父模块不须要打包运行,因此删掉该插件。-->
    <!--<build>-->
        <!--<plugins>-->
            <!--<plugin>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-maven-plugin</artifactId>-->
            <!--</plugin>-->
        <!--</plugins>-->
    <!--</build>-->

</project>

 

2.2 子模块pom配置

一、继承设置

子模块的parent要使用顶层的父模块.

二、依赖设置

父模块pom中使用dependencyManagement来管理的依赖,在子模块pom中就不须要再写版本号了,exclusion元素也不须要再写。

springboot-dubbo-server\pom.xml

<?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">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.practice</groupId>
   <artifactId>springboot-dubbo-server</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>springboot-dubbo-server</name>
   <description>Demo project for Spring Boot</description>

   <!-- 子模块的parent要使用顶层的父模块-->
   <parent>
      <!--<groupId>org.springframework.boot</groupId>-->
      <!--<artifactId>spring-boot-starter-parent</artifactId>-->
      <!--<version>1.5.8.RELEASE</version>-->
      <!--<relativePath/>-->
      <groupId>com.practice</groupId>
      <artifactId>CodeLearnAndPractice</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </parent>

   <!-- properties可删掉,会继承父模块的-->
   <!--<properties>-->
      <!--<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
      <!--<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>-->
      <!--<java.version>1.8</java.version>-->
   <!--</properties>-->

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>

      <!--新增后续dubbo项目中所需依赖,dubbo、zk。
         父模块pom中使用dependencyManagement来管理依赖版本号,子模块pom中不须要再写版本号,exclusion也不须要-->
      <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>dubbo</artifactId>
         <!--<version>2.5.3</version>-->
         <!--<exclusions>-->
            <!--<exclusion>-->
               <!--<groupId>org.springframework</groupId>-->
               <!--<artifactId>spring</artifactId>-->
            <!--</exclusion>-->
         <!--</exclusions>-->
      </dependency>

      <dependency>
         <groupId>com.101tec</groupId>
         <artifactId>zkclient</artifactId>
         <!--<version>0.10</version>-->
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

 

springvoot-dubbo-client/pom.xml

<?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">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.practice</groupId>
   <artifactId>springboot-dubbo-client</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>springboot-dubbo-client</name>
   <description>Demo project for Spring Boot</description>

   <!-- 子模块的parent要使用顶层的父模块-->
   <parent>
      <!--<groupId>org.springframework.boot</groupId>-->
      <!--<artifactId>spring-boot-starter-parent</artifactId>-->
      <!--<version>1.5.8.RELEASE</version>-->
      <!--<relativePath/>-->
      <groupId>com.practice</groupId>
      <artifactId>CodeLearnAndPractice</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </parent>

   <!-- properties可删掉,会继承父模块的-->
   <!--<properties>-->
      <!--<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
      <!--<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>-->
      <!--<java.version>1.8</java.version>-->
   <!--</properties>-->

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>

      <!-- 该模块须要启动web服务,须要该依赖-->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <!--新增后续dubbo项目中所需依赖,dubbo、zk
         父模块pom中使用dependencyManagement来管理依赖版本号,子模块pom中不须要再写版本号
         父模块pom中里有exclusion,子模块pom中不要写exclusion-->
      <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>dubbo</artifactId>
         <!--<version>2.5.3</version>-->
         <!--<exclusions>-->
            <!--<exclusion>-->
               <!--<groupId>org.springframework</groupId>-->
               <!--<artifactId>spring</artifactId>-->
            <!--</exclusion>-->
         <!--</exclusions>-->
      </dependency>

      <dependency>
         <groupId>com.101tec</groupId>
         <artifactId>zkclient</artifactId>
         <!--<version>0.10</version>-->
      </dependency>

      <!--client模块须要依赖server模块-->
      <dependency>
         <groupId>com.practice</groupId>
         <artifactId>springboot-dubbo-server</artifactId>
         <version>0.0.1-SNAPSHOT</version>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>      

 

三、关于exclusions标签

当dependency A自身的依赖B,与其余dependency存在冲突的时候(最多见的就是版本冲突),咱们就须要把B排除掉,这时就须要使用exclusions元素。

那么咱们怎么知道一个dependency自身包含哪些依赖呢?
一、经过mvn dependency:tree命令查看依赖树
二、使用IDEA或其余IDA查看依赖树

点击IDEA右侧的Maven Projects,在每一个模块的Dependencies中便可查看每一个dependency内部的依赖及版本号,历来识别哪些依赖须要被排除掉。

以dubbo为例,咱们先删除配置,点开Maven Projects,能够看到2.5.3版本的dubbo中使用的spring版本是2.5.6,这是一个很老的版本,有一些方法是没有的,如今在用的spring版本通常都是4.*的,因此咱们须要把它排除掉,避免后续报错。

要查看当前项目中使用的spring版本,能够按住左键,而后点击父pom中的值,进入更上一层pom,再重复上步操做,能够看到spring的版本是4.3.12。

avatar

按住左键,而后点击父pom中的值,进入更上一层pom:

avatar

能够看到spring的版本是4.3.12:

avatar

3 测试

这里就先不写代码了,到下一章再写。直接编译一下,若是编译成功,说明pom文件的配置没有什么大问题。

点开右侧Maven Projects,双击父模块Lifecycle中的compile,进行代码编译,或者直接在Terminal中执行命令:mvn compile。

编译经过啦~~

avatar

到这里,Spring Boot多模块项目建立与配置就介绍完啦。

这样一个过程实践下来,再去看开发的代码结构,应该会轻松很多吧~~~

 

 

参考文档:

https://testerhome.com/topics/11359

相关文章
相关标签/搜索