搭建 Springboot + Maven 多模块项目

其实这么久我都没搭建Springboot多模块项目,公司项目只要加module就行,日常项目就一个独立单体工程。这次尝试搭建Springboot multi module聚合工程,顺便学习modulesdependencyManagementdependency的用法,之前理解有些误区。

创建父工程

有一个点要注意,默认创建方式可能会因为网络原因报错Spring Initializr Error,碰到这种情况可以用我图片中地址自定义创建

http://start.springboot.io

因为父工程是一个特殊的Springboot项目,特殊在只要 pom.xml,并不用初始化其他文件,所以这里有两种方案,要么直接下一步,创建成功后,删除不需要的,或者像我一样,修改Type,只要pom.xml

如果是单体项目,为了快速开发,这里可以选择依赖web,但我们这不用管,继续下一步

记得在本地多创建一层路径

因为这是父工程的pom.xml文件,其实这就是BOM

添加如下代码,如果显示jar,将它修改成pom也行

<packaging>pom</packaging>

接下来使用创建子模块,创建方式和上面一样,除了这些子模块需要初始化Springboot默认文件,所以上面那步修改Type在这并不用管。

创建三个子模块:jh-corejh-webjh-admin

记得将子模块中dependencies删干净。

OK,现在来改造父工程pom.xml使用<modules>引入子模块

    <modules>
        <module>jh-core</module>
        <module>jh-web</module>
        <module>jh-admin</module>
    </modules>

它的好处是一键打包

每个子模块都能生成jar,要么被其他子模块依赖使用,要么放到服务器上运行。假设现在子模块jh-corejh-webjh-admin依赖。那如果我们想打包jh-admin,那得先打包jh-core,生成jar后再打包jh-admin。必须有这个顺序,因为后者使用了前者。

但使用modules,可以在父工程一键打包,Maven 会分享我们的子模块和项目,按照子模块之间依赖关系,自动打包,我们就不用关心顺序。

我这举例就三个子模块,依赖关系简单,看起来作用不大,但如果子模块丰富,相互依赖复杂,这就很重要了。

还有个事,如果不配置modules引入子模块,就算子模块配置parent,也无法使用父工程中公共依赖

接着在每个子模块中依赖父工程

	<parent>
		<groupId>com.guozh</groupId>
		<artifactId>juhe</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

然后dependencyManagementdependencies的使用,父工程里的依赖要慎重,只依赖最常用、最公共的jar

因为子工程使用parent会将父工程所有依赖都继承。但项目中可能存在一些工具性质的子模块,它并不需要继承那么多依赖,所以父工程中公共依赖要慎重。将大部分公共、常用依赖放到core模块中,其他子模块需要用到,依赖core就行了。

这是一种解决方案,还有就是用dependencyManagement,它的作用是声明依赖,只声明并不依赖

比如我在里面声明一个依赖

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.4</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

但其实父工程并没真正依赖这个jar,可以在右侧maven中查看,肯定找不到这个依赖。父工程里都没,那子模块肯定也继承不到。所以,这样就不用担心,子模块只是依赖父工程,就将所有依赖就下载。那子模块想用这个依赖怎么办呢?在子模块中依赖需要的。

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

可以看到上面依赖我忽略了版本号,其实这就是dependencyManagement的作用,这里子模块中会使用父工程中声明依赖的版本号。如果其他子模块也使用了这个依赖,也会顺着找到父工程的这个依赖版本号,这样实现统一管理依赖的版本号。

发现没?作用真不大,甚至很鸡肋。

如果想统一管理版本号,那为啥不使用properties呢?

如果只声明并不真正依赖,将公共依赖声明到里面,这样子模块就不会依赖所有的jar包,那干嘛不创建一个类似core性质的公共核心子模块呢?

反正我不喜欢用。

以上就是Springboot搭建多模块项目内容。

本文由老郭种树原创,转载请注明:https://guozh.net/springboot-maven-multi-module/

搭建 Springboot + Maven 多模块项目》有1个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注