前言
最近在做一個很複雜的會員綜合線下線上商城大型專案,單模組專案無法滿足多人開發和架構,很多模組都是重複的就想到了把模組提出來,做成公共模組,基於maven的多模組專案,也好分工開發,也便於後期微服務重構
使用場景
我剛開始建立專案的時候是基於單模組,開發的,我先開發的介面api 專案結構是這樣的
core
模組是公共模組,mallapi 是小程式api
,隨然單體專案這樣的結構也還清晰,但是後面我想到,還有後臺web api
,又要重新建立一個專案,core模組,資料庫連線mode
l模組這些都是通用的,又是需要在後臺專案複製一遍,我覺得很不爽,不友好,程式碼很冗餘,
於是就用SpringBoot+Maven
多模組專案的構建、執行、打包,完美解決問題
專案結構
我建立的基於SpringBoot+Maven
多模組專案結構如下
.
├── kmall-admin
│ ├── kmall-admin.iml
│ ├── log\
│ │ ├── error
│ │ │ ├── error.2021-08-05.log
│ │ │ ├── error.2021-08-06.log
│ │ │ ├── error.2021-08-09.log
│ │ │ └── error.2021-08-10.log
│ │ └── info
│ │ ├── info.2021-08-05.log
│ │ ├── info.2021-08-06.log
│ │ ├── info.2021-08-09.log
│ │ └── info.2021-08-10.log
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ └── soboys
│ │ │ │ └── kmall
│ │ │ │ └── admin
│ │ │ │ ├── GlobalLogAspect.java
│ │ │ │ ├── ServletInitializer.java
│ │ │ │ ├── WebApplication.java
│ │ │ │ ├── business
│ │ │ │ │ └── CouponBusiness.java
│ │ │ │ ├── config
│ │ │ │ │ └── SwaggerConfigure.java
│ │ │ │ ├── controller
│ │ │ │ │ └── CouponController.java
│ │ │ │ └── swagger
│ │ │ │ ├── ApiParamIgnore.java
│ │ │ │ ├── SwaggerParamRead.java
│ │ │ │ └── SwaggerProperty.java
│ │ │ └── resources
│ │ │ ├── application-dev.properties
│ │ │ ├── application-test.properties
│ │ │ ├── application.properties
│ │ │ ├── logback-spring.xml
│ │ │ └── spy.properties
│ │ └── test
│ │ └── java
│ │ └── UtilsTest.java
│ └── target
│ └── classes
│ ├── application-dev.properties
│ ├── application-test.properties
│ ├── application.properties
│ ├── logback-spring.xml
│ └── spy.properties
├── kmall-api
│ ├── log\
│ │ ├── error
│ │ │ ├── error.2021-08-05.log
│ │ │ ├── error.2021-08-06.log
│ │ │ ├── error.2021-08-09.log
│ │ │ └── error.2021-08-10.log
│ │ └── info
│ │ ├── info.2021-08-05.log
│ │ ├── info.2021-08-06.log
│ │ ├── info.2021-08-09.log
│ │ └── info.2021-08-10.log
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ └── soboys
│ │ │ │ └── kmall
│ │ │ │ └── api
│ │ │ │ ├── ApiApplication.java
│ │ │ │ ├── ApiExceptionHandler.java
│ │ │ │ ├── GlobalLogAspect.java
│ │ │ │ ├── ServletInitializer.java
│ │ │ │ ├── authentication
│ │ │ │ │ ├── AuthenticationInterceptor.java
│ │ │ │ │ ├── PassToken.java
│ │ │ │ │ ├── TokenService.java
│ │ │ │ │ └── UserLoginToken.java
│ │ │ │ ├── business
│ │ │ │ │ └── ActivityBusiness.java
│ │ │ │ ├── config
│ │ │ │ │ ├── SwaggerConfigure.java
│ │ │ │ │ ├── WebMvcCfg.java
│ │ │ │ │ ├── WxConfig.java
│ │ │ │ │ └── WxProperties.java
│ │ │ │ ├── controller
│ │ │ │ │ ├── ActivityController.java
│ │ │ │ │ ├── BaseController.java
│ │ │ │ │ ├── CouponController.java
│ │ │ │ │ ├── LoginController.java
│ │ │ │ │ ├── PointController.java
│ │ │ │ │ ├── PostApiController.java
│ │ │ │ │ ├── TestPostApiController.java
│ │ │ │ │ └── UserController.java
│ │ │ │ └── swagger
│ │ │ │ ├── ApiParamIgnore.java
│ │ │ │ ├── SwaggerParamRead.java
│ │ │ │ └── SwaggerProperty.java
│ │ │ └── resources
│ │ │ ├── application-dev.properties
│ │ │ ├── application-test.properties
│ │ │ ├── application.properties
│ │ │ ├── logback-spring.xml
│ │ │ └── spy.properties
│ │ └── test
│ │ └── java
│ └── target
│ └── classes
│ ├── application-dev.properties
│ ├── application-test.properties
│ ├── application.properties
│ ├── logback-spring.xml
│ └── spy.properties
├── kmall-bean
│ ├── kmall-bean.iml
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ └── soboys
│ │ │ └── kmall
│ │ │ └── bean
│ │ │ ├── model
│ │ │ │ ├── Coupon.java
│ │ │ │ ├── CouponTemplate.java
│ │ │ │ ├── PointOrder.java
│ │ │ │ ├── PointRecord.java
│ │ │ │ ├── User.java
│ │ │ │ └── UserCoupon.java
│ │ │ ├── params
│ │ │ │ ├── LoginParams.java
│ │ │ │ ├── SexEnum.java
│ │ │ │ └── UserUpdateParams.java
│ │ │ └── web
│ │ │ └── params
│ │ │ └── GenerateCouponParams.java
│ │ └── resources
│ └── test
│ └── java
├── kmall-common
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ └── soboys
│ │ │ │ └── kmall
│ │ │ │ └── common
│ │ │ │ ├── BaseAspectSupport.java
│ │ │ │ ├── LogSubject.java
│ │ │ │ ├── componnent
│ │ │ │ │ ├── CustomIdGenerator.java
│ │ │ │ │ └── UniqueNameGenerator.java
│ │ │ │ ├── config
│ │ │ │ │ ├── MybatisPlusConfigure.java
│ │ │ │ │ └── RestTemplateConfig.java
│ │ │ │ ├── convert
│ │ │ │ │ ├── RequestJson.java
│ │ │ │ │ └── RequestJsonHandlerMethodArgumentResolver.java
│ │ │ │ ├── exception
│ │ │ │ │ ├── AuthenticationException.java
│ │ │ │ │ ├── BusinessException.java
│ │ │ │ │ ├── GlobalErrorHandler.java
│ │ │ │ │ └── GlobalExceptionHandler.java
│ │ │ │ ├── ret
│ │ │ │ │ ├── ResponseResult.java
│ │ │ │ │ ├── ResponseResultHandler.java
│ │ │ │ │ ├── ResponseResultInterceptor.java
│ │ │ │ │ ├── Result.java
│ │ │ │ │ ├── ResultCode.java
│ │ │ │ │ └── ResultResponse.java
│ │ │ │ ├── serializer
│ │ │ │ │ └── json
│ │ │ │ │ ├── ClassJsonConfiguration.java
│ │ │ │ │ ├── DoubleJsonSerialize.java
│ │ │ │ │ ├── MyBeanSerializerModifier.java
│ │ │ │ │ ├── NullArrayJsonSerializer.java
│ │ │ │ │ ├── NullIntegerJsonSerializer.java
│ │ │ │ │ └── NullStringJsonSerializer.java
│ │ │ │ ├── utils
│ │ │ │ │ ├── HttpClientUtils.java
│ │ │ │ │ ├── HttpContextUtil.java
│ │ │ │ │ ├── PageRequest.java
│ │ │ │ │ ├── QrCodeUtil.java
│ │ │ │ │ └── ResponseUtil.java
│ │ │ │ └── validator
│ │ │ │ ├── IsDateTime.java
│ │ │ │ ├── IsDateTimeValidator.java
│ │ │ │ ├── IsEnum.java
│ │ │ │ ├── IsEnumValidator.java
│ │ │ │ ├── IsMobile.java
│ │ │ │ ├── IsMobileValidator.java
│ │ │ │ ├── IsMoney.java
│ │ │ │ ├── IsMoneyValidator.java
│ │ │ │ ├── UrlMatcher.java
│ │ │ │ └── ValidatorUtil.java
│ │ │ └── resources
│ │ └── test
│ │ └── java
│ └── target
│ ├── classes
│ │ └── cn
│ │ └── soboys
│ │ └── kmall
│ │ └── common
│ │ ├── BaseAspectSupport.class
│ │ ├── LogSubject.class
│ │ ├── componnent
│ │ │ └── UniqueNameGenerator.class
│ │ ├── config
│ │ │ ├── MybatisPlusConfigure.class
│ │ │ ├── RestTemplateConfig$1.class
│ │ │ └── RestTemplateConfig.class
│ │ ├── convert
│ │ │ ├── RequestJson.class
│ │ │ ├── RequestJsonHandlerMethodArgumentResolver$NamedValueInfo.class
│ │ │ ├── RequestJsonHandlerMethodArgumentResolver$RequestCustomParamNamedValueInfo.class
│ │ │ ├── RequestJsonHandlerMethodArgumentResolver$RequestPartResolver.class
│ │ │ └── RequestJsonHandlerMethodArgumentResolver.class
│ │ ├── exception
│ │ │ ├── AuthenticationException.class
│ │ │ ├── BusinessException.class
│ │ │ ├── GlobalErrorHandler.class
│ │ │ └── GlobalExceptionHandler.class
│ │ ├── ret
│ │ │ ├── ResponseResult.class
│ │ │ ├── ResponseResultHandler.class
│ │ │ ├── ResponseResultInterceptor.class
│ │ │ ├── Result.class
│ │ │ ├── ResultCode.class
│ │ │ └── ResultResponse.class
│ │ ├── serializer
│ │ │ └── json
│ │ │ ├── ClassJsonConfiguration.class
│ │ │ ├── DoubleJsonSerialize.class
│ │ │ ├── MyBeanSerializerModifier.class
│ │ │ ├── NullArrayJsonSerializer.class
│ │ │ ├── NullIntegerJsonSerializer.class
│ │ │ └── NullStringJsonSerializer.class
│ │ ├── utils
│ │ │ ├── HttpClientUtils$1.class
│ │ │ ├── HttpClientUtils.class
│ │ │ ├── HttpContextUtil.class
│ │ │ ├── PageRequest.class
│ │ │ ├── QrCodeUtil.class
│ │ │ └── ResponseUtil.class
│ │ └── validator
│ │ ├── IsDateTime.class
│ │ ├── IsDateTimeValidator.class
│ │ ├── IsEnum.class
│ │ ├── IsEnumValidator.class
│ │ ├── IsMobile.class
│ │ ├── IsMobileValidator.class
│ │ ├── IsMoney.class
│ │ ├── IsMoneyValidator.class
│ │ ├── UrlMatcher.class
│ │ └── ValidatorUtil.class
│ └── generated-sources
│ └── annotations
├── kmall-quartz
│ ├── kmall-quartz.iml
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ └── java
├── kmall-security
│ ├── kmall-security.iml
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ └── soboys
│ │ │ │ └── kmall
│ │ │ │ └── security
│ │ │ │ ├── config
│ │ │ │ │ ├── JwtAuthenticationEntryPoint.java
│ │ │ │ │ ├── JwtRequestFilter.java
│ │ │ │ │ └── SecurityConfig.java
│ │ │ │ ├── controller
│ │ │ │ │ └── LoginController.java
│ │ │ │ ├── entity
│ │ │ │ │ └── User.java
│ │ │ │ ├── mapper
│ │ │ │ │ └── UserMapper.java
│ │ │ │ ├── service
│ │ │ │ │ ├── IUserService.java
│ │ │ │ │ ├── JwtUserDetailsService.java
│ │ │ │ │ └── impl
│ │ │ │ │ └── UserServiceImpl.java
│ │ │ │ └── utils
│ │ │ │ ├── EncryptPwdUtil.java
│ │ │ │ └── JwtTokenUtil.java
│ │ │ └── resources
│ │ │ └── security.properties
│ │ └── test
│ │ └── java
│ └── target
│ ├── classes
│ │ ├── cn
│ │ │ └── soboys
│ │ │ └── kmall
│ │ │ └── security
│ │ │ ├── config
│ │ │ │ ├── JwtAuthenticationEntryPoint.class
│ │ │ │ ├── JwtRequestFilter.class
│ │ │ │ └── SecurityConfig.class
│ │ │ ├── controller
│ │ │ │ └── LoginController.class
│ │ │ ├── entity
│ │ │ │ └── User.class
│ │ │ ├── mapper
│ │ │ │ └── UserMapper.class
│ │ │ ├── service
│ │ │ │ ├── IUserService.class
│ │ │ │ ├── JwtUserDetailsService.class
│ │ │ │ └── impl
│ │ │ │ └── UserServiceImpl.class
│ │ │ └── utils
│ │ │ ├── EncryptPwdUtil.class
│ │ │ └── JwtTokenUtil.class
│ │ └── security.properties
│ └── generated-sources
│ └── annotations
├── kmall-service
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ └── soboys
│ │ │ │ └── kmall
│ │ │ │ ├── MyBatisGeneratorCode.java
│ │ │ │ ├── mapper
│ │ │ │ │ ├── CouponMapper.java
│ │ │ │ │ ├── CouponTemplateMapper.java
│ │ │ │ │ ├── PointOrderMapper.java
│ │ │ │ │ ├── PointRecordMapper.java
│ │ │ │ │ ├── UserCouponMapper.java
│ │ │ │ │ └── UserMapper.java
│ │ │ │ └── service
│ │ │ │ ├── ICouponService.java
│ │ │ │ ├── ICouponTemplateService.java
│ │ │ │ ├── IPointOrderService.java
│ │ │ │ ├── IPointRecordService.java
│ │ │ │ ├── IUserCouponService.java
│ │ │ │ ├── IUserService.java
│ │ │ │ └── impl
│ │ │ │ ├── CouponServiceImpl.java
│ │ │ │ ├── CouponTemplateServiceImpl.java
│ │ │ │ ├── PointOrderServiceImpl.java
│ │ │ │ ├── PointRecordServiceImpl.java
│ │ │ │ ├── UserCouponServiceImpl.java
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources
│ │ │ └── mapper
│ │ │ ├── CouponMapper.xml
│ │ │ ├── CouponTemplateMapper.xml
│ │ │ ├── PointRecordMapper.xml
│ │ │ ├── TzUserMapper.xml
│ │ │ └── UserCouponMapper.xml
│ │ └── test
│ │ └── java
│ └── target
│ └── classes
│ └── mapper
│ ├── CouponMapper.xml
│ ├── CouponTemplateMapper.xml
│ ├── PointRecordMapper.xml
│ ├── TzUserMapper.xml
│ └── UserCouponMapper.xml
├── kmall-sys
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ └── soboys
│ │ │ │ └── kmall
│ │ │ │ └── sys
│ │ │ │ ├── MyBatisGeneratorCode.java
│ │ │ │ ├── controller
│ │ │ │ │ ├── MenuController.java
│ │ │ │ │ ├── TRoleController.java
│ │ │ │ │ ├── TRoleMenuController.java
│ │ │ │ │ ├── TUserRoleController.java
│ │ │ │ │ └── UserController.java
│ │ │ │ ├── entity
│ │ │ │ │ ├── Menu.java
│ │ │ │ │ ├── Role.java
│ │ │ │ │ ├── RoleMenu.java
│ │ │ │ │ ├── User.java
│ │ │ │ │ └── UserRole.java
│ │ │ │ ├── mapper
│ │ │ │ │ ├── MenuMapper.java
│ │ │ │ │ ├── RoleMapper.java
│ │ │ │ │ ├── RoleMenuMapper.java
│ │ │ │ │ ├── UserMapper.java
│ │ │ │ │ └── UserRoleMapper.java
│ │ │ │ ├── params
│ │ │ │ ├── result
│ │ │ │ │ └── MenuResult.java
│ │ │ │ └── service
│ │ │ │ ├── IMenuService.java
│ │ │ │ ├── IRoleMenuService.java
│ │ │ │ ├── IRoleService.java
│ │ │ │ ├── IUserRoleService.java
│ │ │ │ ├── IUserService.java
│ │ │ │ └── impl
│ │ │ │ ├── MenuServiceImpl.java
│ │ │ │ ├── RoleMenuServiceImpl.java
│ │ │ │ ├── RoleServiceImpl.java
│ │ │ │ ├── UserRoleServiceImpl.java
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources
│ │ │ └── mapper
│ │ │ └── MenuMapper.xml
│ │ └── test
│ │ └── java
│ └── target
│ ├── classes
│ │ ├── cn
│ │ │ └── soboys
│ │ │ └── kmall
│ │ │ └── sys
│ │ │ ├── MyBatisGeneratorCode$1.class
│ │ │ ├── MyBatisGeneratorCode$2.class
│ │ │ ├── MyBatisGeneratorCode.class
│ │ │ ├── controller
│ │ │ │ ├── TRoleController.class
│ │ │ │ ├── TRoleMenuController.class
│ │ │ │ └── TUserRoleController.class
│ │ │ ├── entity
│ │ │ │ ├── Menu.class
│ │ │ │ ├── Role.class
│ │ │ │ ├── RoleMenu.class
│ │ │ │ ├── User.class
│ │ │ │ └── UserRole.class
│ │ │ ├── mapper
│ │ │ │ ├── MenuMapper.class
│ │ │ │ ├── RoleMapper.class
│ │ │ │ ├── RoleMenuMapper.class
│ │ │ │ ├── UserMapper.class
│ │ │ │ └── UserRoleMapper.class
│ │ │ └── result
│ │ │ └── MenuResult.class
│ │ └── mapper
│ │ └── MenuMapper.xml
│ └── generated-sources
│ └── annotations
├── kmall.iml
├── pom.xml
└── src
├── main
│ ├── java
│ └── resources
│ └── mapper
│ ├── PointOrderMapper.xml
│ ├── TMenuMapper.xml
│ ├── TRoleMapper.xml
│ ├── TRoleMenuMapper.xml
│ ├── TUserMapper.xml
│ └── TUserRoleMapper.xml
└── test
└── java
kmall-admin
模組 後臺模組,後臺介面apikmall-api
模組前端小程式,app的apikmall-bean
實體bean 模組kmall-common
公共模組kmall-quartz
定時任務模組kmall-service
服務模組kmall-security
安全認證模組kmall-sys
後臺系統模組
專案依賴管理打包
首先最外層kmall
是父模組 管理著所有的版本和依賴,外層pom如下
<?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>cn.soboys.kmall</groupId>
<artifactId>kmall</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>kmall-common</module>
<module>kmall-bean</module>
<module>kmall-service</module>
<module>kmall-api</module>
<module>kmall-admin</module>
<module>kmall-sys</module>
<module>kmall-security</module>
<module>kmall-quartz</module>
</modules>
<packaging>pom</packaging>
<!--引用springBoot父專案-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<kmall.version>1.0-SNAPSHOT</kmall.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
<maven.resources.plugin.version>3.2.0</maven.resources.plugin.version>
<maven.jar.plugin.version>3.2.0</maven.jar.plugin.version>
<maven-war-plugin.version>3.2.3</maven-war-plugin.version>
<spring-boot.version>2.4.7</spring-boot.version>
<mybatis.plus.boot.starter.version>3.4.3</mybatis.plus.boot.starter.version>
<mybatis-plus-generator.version>3.4.1</mybatis-plus-generator.version>
<freemarker.version>2.3.31</freemarker.version>
<p6spy.version>3.9.0</p6spy.version>
<fastjson.version>1.2.76</fastjson.version>
<jjwt.version>0.9.1</jjwt.version>
<java-jwt.version>3.15.0</java-jwt.version>
<weixin-java-miniapp.version>4.0.0</weixin-java-miniapp.version>
<weixin-java-pay.version>4.0.0</weixin-java-pay.version>
<hutool.version>5.7.0</hutool.version>
<ip2region.version>1.0.3.RELEASE</ip2region.version>
<knife4j.version>3.0.1</knife4j.version>
</properties>
<!--dependencyManagement裡只是宣告依賴,並不自動實現引入,因此子專案需要顯示的宣告需要用的依賴
如果不在子專案中宣告依賴,是不會從父專案中繼承下來的;只有在子專案中寫了該依賴項,並且沒有指定具體版本,才會從父專案中繼承該項,
並且version和scope都讀取自父pom;另外如果子專案中指定了版本號,那麼會使用子專案中指定的jar版本
-->
<!--統一管理依賴的版本號-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-common</artifactId>
<version>${kmall.version}</version>
</dependency>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-bean</artifactId>
<version>${kmall.version}</version>
</dependency>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-service</artifactId>
<version>${kmall.version}</version>
</dependency>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-security</artifactId>
<version>${kmall.version}</version>
</dependency>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-sys</artifactId>
<version>${kmall.version}</version>
</dependency>
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.boot.starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-generator.version}</version>
</dependency>
<dependency>
<groupId>com.github.hiwepy</groupId>
<artifactId>ip2region-spring-boot-starter</artifactId>
<version>${ip2region.version}</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>${p6spy.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin-java-miniapp.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>${weixin-java-pay.version}</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>${java-jwt.version}</version>
</dependency>
<!-- <dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>-->
<!--json 序列化-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>${hutool.version}</version>
<!--<exclusions>
<exclusion>
<groupId>cn.hutool</groupId>
<artifactId>hutool-setting</artifactId>
</exclusion>
</exclusions>-->
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-extra</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- 環境資訊 -->
<profiles>
<!-- 標機開發環境 -->
<profile>
<id>dev</id>
<properties>
<activeProfile>dev</activeProfile>
<serviceactive>servicedev</serviceactive>
<businessactive>businessdev</businessactive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<!-- 測試環境 -->
<profile>
<id>test</id>
<properties>
<activeProfile>test</activeProfile>
<serviceactive>servicetest</serviceactive>
<businessactive>businesstest</businessactive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 生產環境 -->
<profile>
<id>product</id>
<properties>
<activeProfile>product</activeProfile>
<serviceactive>serviceproduct</serviceactive>
<businessactive>businessproduct</businessactive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
</project>
我們可以把很多公用
的配置放在父模組中如打包環境配置
,jar包版本依賴
,那樣的話子模組的pom.xml配置的東西就非常的少了,方便閱讀。
這裡父專案的pom.xml主要是配置了都需要的SpringBoot
的相關引用,這樣的話我們子專案完全不需要再重複引用了。另外其配置了profiles
屬性,這個屬性是讓我們區分多環境是打包哪些配置檔案,其id引數
就是我們的要打包環境的一個標識,比如我們打包測試環境我們只需要執行clean install -Ptest即可,-P後面的值即為這個id值,其中properties屬性裡面的列表是標識該環境生效的配置檔案,屬性裡面的是SpringBoot配置檔案後面的值,比如application-serviceproduct.properties其值就為serviceproduct
我們在看下kmall-common
公共模組pom配置如下
<?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>kmall</artifactId>
<groupId>cn.soboys.kmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>kmall-common</artifactId>
<dependencies>
<!--aop 切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--ip獲取位置-->
<dependency>
<groupId>com.github.hiwepy</groupId>
<artifactId>ip2region-spring-boot-starter</artifactId>
</dependency>
<!--api 文件-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
<!--資料庫jar################-->
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--生成器依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<!--MyBatis-Plus 從 3.0.3 之後移除了程式碼生成器與模板引擎的預設依賴,需要手動新增相關依賴:-->
<!--新增 模板引擎 依賴,MyBatis-Plus 支援 Velocity(預設)、
Freemarker、Beetl,使用者可以選擇自己熟悉的模板引擎,
如果都不滿足您的要求,可以採用自定義模板引擎。-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<!-- p6spy sql攔截除錯-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
</dependency>
<!--資料庫jar################-->
<!--微信小程式工具sdk-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
</dependency>
<!--微信支付工具sdk-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
</dependency>
<!--hutool 工具庫-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<!--<exclusions>
<exclusion>
<groupId>cn.hutool</groupId>
<artifactId>hutool-setting</artifactId>
</exclusion>
</exclusions>-->
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-extra</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
</dependency>
<!--json 序列化-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project>
這裡因為kmall
父模組做了專案版本管理,所以這裡只需要引入依賴就可以,依賴版本由父模組決定
然後我們在看一下kmall-bean
模組pom
<?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>kmall</artifactId>
<groupId>cn.soboys.kmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>kmall-bean</artifactId>
<dependencies>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-common</artifactId>
</dependency>
<!--引數校驗-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
</project>
依賴於公共模組,也單獨引用了引數校驗依賴
我們在看一下kmall-service
模組pom
<?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>kmall</artifactId>
<groupId>cn.soboys.kmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>kmall-service</artifactId>
<dependencies>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-common</artifactId>
</dependency>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-bean</artifactId>
</dependency>
</dependencies>
</project>
依賴於公共模組,和bean模組
接下來我們看下兩個主模組 kmall-api
有springboot啟動類入口
ApiApplication
是springboot啟動類
package cn.soboys.kmall.api;
import cn.hutool.extra.spring.EnableSpringUtil;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication(scanBasePackages = {"cn.soboys.kmall"})
@MapperScan("cn.soboys.kmall.mapper")
@EnableSpringUtil
public class ApiApplication {
private static ApplicationContext applicationContext;
public static void main(String[] args) {
applicationContext =
SpringApplication.run(ApiApplication.class, args);
//displayAllBeans();
}
/**
* 列印所以裝載的bean
*/
public static void displayAllBeans() {
String[] allBeanNames = applicationContext.getBeanDefinitionNames();
for (String beanName : allBeanNames) {
System.out.println(beanName);
}
}
}
我們來看一下他的pom
<?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>kmall</artifactId>
<groupId>cn.soboys.kmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>kmall-api</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-service</artifactId>
</dependency>
<!--jwt 認證-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
</dependency>
</dependencies>
<!--打包-->
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven.resources.plugin.version}</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven.jar.plugin.version}</version>
</plugin>
<!-- <plugin>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration> <!– Exclude JCL and LOG4J since all logging should go through SLF4J. Note that we're excluding log4j-<version>.jar but keeping log4j-over-slf4j-<version>.jar –>
<packagingExcludes>
WEB-INF/lib/hutool-setting.jar,
</packagingExcludes>
</configuration>
</plugin>-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
這裡pom做了一個打包的處理,我們需要打包時候只需要通過 IDEA 進行打包就可以啦
package進行打包war 釋出到伺服器就可以執行啦
我們再來看一下後臺模組kmall-admin
有springboot啟動類入口WebApplication
@SpringBootApplication
@MapperScan(value = {"cn.soboys.kmall.mapper","cn.soboys.kmall.sys.mapper","cn.soboys.kmall.security.mapper"},nameGenerator = UniqueNameGenerator.class)
@ComponentScan(value = {"cn.soboys.kmall"},nameGenerator = UniqueNameGenerator.class)
public class WebApplication {
private static ApplicationContext applicationContext;
public static void main(String[] args) {
applicationContext =
SpringApplication.run(WebApplication.class, args);
//displayAllBeans();
}
/**
* 列印所以裝載的bean
*/
public static void displayAllBeans() {
String[] allBeanNames = applicationContext.getBeanDefinitionNames();
for (String beanName : allBeanNames) {
System.out.println(beanName);
}
}
}
看下它的pom結構
<?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>kmall</artifactId>
<groupId>cn.soboys.kmall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<artifactId>kmall-admin</artifactId>
<dependencies>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-service</artifactId>
</dependency>
<dependency>
<groupId>cn.soboys.kmall</groupId>
<artifactId>kmall-sys</artifactId>
</dependency>
</dependencies>
<!--打包-->
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven.resources.plugin.version}</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven.jar.plugin.version}</version>
</plugin>
<!-- <plugin>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration> <!– Exclude JCL and LOG4J since all logging should go through SLF4J. Note that we're excluding log4j-<version>.jar but keeping log4j-over-slf4j-<version>.jar –>
<packagingExcludes>
WEB-INF/lib/hutool-setting.jar,
</packagingExcludes>
</configuration>
</plugin>-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
這裡我配置檔案中環境啟用是根據父模組pom中配置走的 spring.profiles.active=@activeProfile@,@serviceactive@,@businessactive@
這裡的值取值與父pom中環境打包配置
然後我們在打包前勾選需要打包的環境就可以了
這樣基於SpringBoot+Maven 多模組專案的構建、執行、打包實戰就完成啦,如果有什麼疑問可以關注我公眾猿小叔