最近把项目代码进行了重构,根据规范大致对进行中的项目进行了模块划分。
多模块的优点:
可维护性
1.灵活架构,焦点分离
2.方便模块间组合、分解
3.方便单个模块功能调试、升级
4.多人协作互不干扰
springBoot多模块划分
根据通用规范,我把项目划分为如下模块
<modules>
<module>gyjc-web</module>
<module>gyjc-service</module>
<module>gyjc-common</module>
<module>gyjc-task</module>
<module>gyjc-api</module>
<module>gyjc-entity</module>
<module>gyjc-statistics</module>
</modules>
除了statistics为项目个性化统计模块、task为定时任务、线程定义的模块外,其它都是一些常见的通用模块。
为了对项目版本进行统一的管理,我在外层的pom文件中使用了revision来统一版本信息。
<artifactId>gyjcProj</artifactId>
<packaging>pom</packaging>
<version>${revision}</version>
<properties>
<revision>1.8.1-SNAPSHOT</revision>
</properties>
子模块的pom文件中这样定义
<parent>
<artifactId>gyjcProj</artifactId>
<groupId>xxxx</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gyjc-api</artifactId>
<dependencies>
<dependency>
<groupId>xxxx</groupId>
<artifactId>gyjc-entity</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
这样修改版本号时只需修改外部pom文件的版本号即可。
多模块划分后,对于部分只在某个模块使用的依赖包,可以只在子模块的pom文件中引入,避免父模块pom文件过长难以维护。
比如要启动的是web模块,在web模块的pom文件中加入其它模块的依赖后,配置如下:
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>gyjc-web</artifactId>
<dependencies>
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 设置启动类入口 -->
<mainClass>com.xxxx.MybatisplusSpringbootApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--打包时跳过test的编译-->
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
其中goal的repackage表示打包时将其它依赖包打到web包里,配置启动类后,这样就可以直接运行启动了。
多模块划分后,以后如果想加一些个性化功能,可以直接另开模块实现,若部分模块不需要了也只需要在web 的依赖中去除即可。