Gradle8.4构建SpringBoot多模块项目

铁佛  金牌会员 | 2023-11-26 21:59:02 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

Gradle8.4构建SpringBoot多模块项目

一、基本

1、版本


  • 这个版本是Jdk8最后一个SpringBoot版本
软件版本Gradle8.4SpringBoot2.7.15JDK82、Gradle基本介绍

2.1、使用Wrapper方式构建


  • 好处:统一gradle的版本
  • 好处:不用安装gradle就可以使用
  • Maven也是一样的可以用Wrapper的方式
2.2、导包方式


  • 列举常用的四种
  1. implementation
  2. api
  3. compileOnly
  4. compileOnlyApi
复制代码
①、implementation

  • 导入依赖,不传递给子模块,依赖项将被编译和打包到项目中
②、api

  • 导入依赖,传递给子模块,依赖项将被编译和打包到项目中
③、implementation和api的区别
④、compileOnly

  • 导入依赖,不传递给子模块,依赖项将被编译到项目中,不打包到项目
⑤、compileOnlyApi

  • 导入依赖,传递给子模块,依赖项将被编译到项目中,不打包到项目
2.3、build.gradle配置文件


  • 相当于Maven的pom文件,主要是配置模块,导入依赖的作用
①、allprojects

  • 里面的配置,所有模块生效
  • 一般配置包的信息、编码、仓库地址
  1. allprojects {
  2. }
复制代码
②、subprojects

  • 里面的配置,只有自己和子模块生效
  • 一般配置插件、统一包的版本管理、打包方式等等
  1. subprojects {
  2. }
复制代码
③、dependencies

  • 导入依赖,相当于Maven的 导包
  • 引入依赖演示
  1. dependencies {
  2.     // api可以传递依赖、implementation不能传递依赖
  3.     // hutool工具类
  4.     api 'cn.hutool:hutool-all'
  5. }
复制代码

  • 引入模块演示
  1. dependencies {
  2.     //依赖公共模块
  3.     api project(":模块地址")
  4.     implementation project(":GradleParent:GradleUtil")
  5. }
复制代码
2.4、settings.gradle配置文件


  • 配置模块间的信息,见后面具体实现
二、实现

1、项目结构
  1. -GradleMultiModule
  2. -GradleParent          包装common、util的父模块(实际中可以不要,这里演示导包、传递依赖等)
  3.   -GradleCommon         公共模块,用于装entity或者mapper等
  4.   -GradleUtil           工具类模块
  5. -GradleServer          业务模块的父模块,用于给子模块统一导入springboot的包
  6.   -GradleOne            业务模块1 - 依赖GradleCommon、GradleUtil
  7.   -GradleTwo            业务模块2 - 依赖
  8.   -GradleStart          启动模块 - 导入GradleOne、GradleTwo依赖,启动项目
复制代码

  • 结构

2、新建模块


  • 只演示一遍
  • 就是用idea创建springboot的gradle项目

3、各个模块的配置及类

3.1、GradleMultiModule模块


  • 顶级父模块
  • 统一配置 build.gradle (还可以配置gradle的版本)
  • 配置所有模块的关系 settings.gradle
  • ①、build.gradle
  • wrapper:配置gradle的版本,需要单独点击执行,执行后查看gradle版本是否生效


  • 具体配置
  1. //插件
  2. plugins {
  3.     id 'java'
  4.     id 'idea'
  5.     id 'java-library'
  6.     id 'org.springframework.boot' version '2.7.15'
  7.     id 'io.spring.dependency-management' version '1.0.15.RELEASE'
  8. }
  9. //allprojects:所有模块生效
  10. allprojects {
  11.     // 配置项目信息
  12.     group = 'com.cc'
  13.     version = '0.0.1-SNAPSHOT'
  14.     // 配置字符编码
  15.     tasks.withType(JavaCompile).configureEach {
  16.         options.encoding = 'UTF-8'
  17.     }
  18.     java {
  19.         sourceCompatibility = '8'
  20.         targetCompatibility = '8'
  21.     }
  22.     //仓库配置
  23.     repositories {
  24.         //本地
  25.         mavenLocal()
  26.         //阿里仓库
  27.         maven { url 'https://maven.aliyun.com/repository/public/' }
  28.         //公司仓库。必须用:https。Gradle默认情况下不允许使用不安全的协议,以提高安全性。
  29.         maven { url 'https://******:****/repository/maven-public/' }
  30.         //中央仓库
  31.         mavenCentral()
  32.     }
  33. }
  34. //subprojects:所有子模块生效——springboot配置、导包版本管理、打包管理
  35. subprojects {
  36.     apply plugin: 'java'
  37.     apply plugin: 'java-library'
  38.     apply plugin: 'idea'
  39.     //所有子模块都是springboot项目,如不是,不能打包。
  40.     apply plugin: 'org.springframework.boot'
  41.     apply plugin: 'io.spring.dependency-management'
  42.     //所有子模块的-依赖版本管理
  43.     dependencyManagement {
  44.         dependencies {
  45.             dependency 'cn.hutool:hutool-all:5.0.7'
  46.             dependency "org.apache.commons:commons-lang3:3.5"
  47.         }
  48.     }
  49.     //使用 gradle打包工具
  50.     jar {
  51.         manifest.attributes provider: 'gradle'
  52.     }
  53.     tasks.named('test') {
  54.         useJUnitPlatform()
  55.     }
  56. }
  57. // 配置gradle的版本
  58. wrapper {
  59.     //gradle的版本
  60.     gradleVersion = '8.4'
  61.     //版本类型:BIN、ALL(完全版,可以看gradle的代码)
  62.     distributionType = 'ALL'
  63. }
复制代码

  • ①、settings.gradle
  • 配置模块间的关系
  • 可以新增一个模块配置一个模块,不用一次性配置完成
  • 具体配置
  1. rootProject.name = 'GradleMultiModule'
  2. //公共模块总模块
  3. include 'GradleParent'
  4. include ':GradleParent:GradleCommon'
  5. include ':GradleParent:GradleUtil'
  6. project(':GradleParent:GradleCommon')?.name = 'GradleCommon'
  7. project(':GradleParent:GradleUtil')?.name = 'GradleUtil'
  8. //业务模块总模块
  9. include 'GradleServer'
  10. include ':GradleServer:GradleStart'
  11. include ':GradleServer:GradleOne'
  12. include ':GradleServer:GradleTwo'
  13. project(':GradleServer:GradleStart')?.name = 'GradleStart'
  14. project(':GradleServer:GradleOne')?.name = 'GradleOne'
  15. project(':GradleServer:GradleTwo')?.name = 'GradleTwo'
复制代码
3.2、GradleParent模块(公共)


  • 统一公共模块依赖
  • build.gradle
  1. //配置所有子模块
  2. subprojects {
  3.     //这里可以导入公共的依赖
  4.     dependencies {
  5.         // compileOnly:这样做可以确保Lombok在编译时可用,但不会包含在最终的构建产物中,从而减小构建产物的大小。
  6.         // api:依赖可以传递给子模块
  7.         // compileOnlyApi:仅编译时可用,不包含在构建产物中,并且可以传递给子模块
  8.         compileOnlyApi 'org.projectlombok:lombok'
  9.         // 表示将Lombok库作为注解处理器导入。
  10.         annotationProcessor 'org.projectlombok:lombok'
  11.     }
  12. }
复制代码
3.3、GradleCommon模块(公共)


  • 公共模块,存放Entity
  • build.gradle
  1. dependencies {
  2.     // api可以传递依赖、implementation不能传递依赖
  3.     // hutool工具类
  4.     api 'cn.hutool:hutool-all'
  5. }
复制代码
新建的类

3.4、GradleUtil模块(公共)


  • 存放所有工具类
  • build.gradle
  1. dependencies {
  2.     // api可以传递依赖、implementation不能传递依赖
  3.     api 'org.apache.commons:commons-lang3'
  4. }
复制代码
新建类

3.5、GradleServer模块(业务)


  • 业务模块的父模块,用于统一导入springboot的包
  • build.gradle
  1. // 子模块生效
  2. subprojects {
  3.     //配置子模块依赖
  4.     dependencies {
  5.         //导入业务模块的公共包 - SpringBoot的包
  6.         //不用api,不用传递
  7.         implementation 'org.springframework.boot:spring-boot-starter'
  8.         implementation 'org.springframework.boot:spring-boot-starter-web'
  9.         testImplementation 'org.springframework.boot:spring-boot-starter-test'
  10.     }
  11. }
复制代码
3.6、GradleOne模块(业务)


  • 引入:GradleCommon、GradleUtil模块
  • 测试是否能使用引入模块的类、引入模块的依赖
  • build.gradle
  1. dependencies {
  2.     //依赖公共模块
  3.     //api传递给子模块
  4.     api project(":GradleParent:GradleCommon")
  5.     api project(":GradleParent:GradleUtil")
  6. }
复制代码

  • 启动提示

  • 测试

3.7、GradleTwo模块(业务)


  • 引入:GradleCommon、GradleUtil模块
  • 测试是否能使用引入模块的类、引入模块的依赖
  • build.gradle
  1. dependencies {
  2.     //依赖公共模块:implementation不传递依赖;api传递依赖
  3.     //这里不传递依赖,因为会造成GradleStart有多个重复依赖
  4.     implementation project(":GradleParent:GradleCommon")
  5.     implementation project(":GradleParent:GradleUtil")
  6. }
复制代码

  • 启动提示

  • 测试

3.8、GradleStart启动模块(业务)


  • 启动springboot项目
  • 引入所有业务模块
  • 配置SpringMVc
  • 此模块不写任何的业务
  • build.gradle
  1. dependencies {
  2.     // 依赖GradleOne、GradleTwo,将该模块纳入启动中(加入springboot项目中)
  3.     api project(':GradleServer:GradleOne')
  4.     api project(':GradleServer:GradleTwo')
  5.     // 其他依赖项...
  6. }
复制代码

  • SpringMvc配置
  1. package com.cc.go.config;
  2. import org.springframework.boot.SpringBootConfiguration;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.web.cors.CorsConfiguration;
  5. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  6. import org.springframework.web.filter.CorsFilter;
  7. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  8. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  9. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  10. import javax.annotation.Resource;
  11. import java.util.ArrayList;
  12. /** <p>SpringMvc配置<p>
  13. * <li>自定义Spring MVC的特性和扩展Spring MVC的功能</li>
  14. * @since 2023/9/21
  15. * @author CC
  16. **/
  17. @SpringBootConfiguration
  18. public class WebGlobalConfig implements WebMvcConfigurer {
  19.     @Resource
  20.     private MyHandlerInterceptor myHandlerInterceptor;
  21.     /**
  22.      * 拦截器(Interceptors)
  23.      */
  24.     @Override
  25.     public void addInterceptors(InterceptorRegistry registry) {
  26.         ArrayList<String> list = new ArrayList<>();
  27.         list.add("/login");
  28.         //自定义拦截器,或其他拦截器
  29.         registry.addInterceptor(myHandlerInterceptor)
  30.                 //添加拦截地址为所有拦截
  31.                 .addPathPatterns("/**")
  32.                 //不拦截的地址
  33.                 .excludePathPatterns(list);
  34.     }
  35.     /**
  36.      * 资源处理器(Resource Handlers)
  37.      */
  38.     @Override
  39.     public void addResourceHandlers(ResourceHandlerRegistry registry) {
  40.         registry.addResourceHandler("/**")
  41.                 .addResourceLocations("classpath:/resources/","classpath:/static/");
  42.     }
  43.     /**
  44.      * 跨域资源共享(CORS)
  45.      */
  46.     @Bean
  47.     public CorsFilter corsFilter() {
  48.         //创建CorsConfiguration对象后添加配置
  49.         CorsConfiguration config = new CorsConfiguration();
  50.         //允许所有原始域
  51.         config.addAllowedOriginPattern("*");
  52.         //允许所有头部信息
  53.         config.addAllowedHeader("*");
  54.         //允许所有头部信息
  55.         config.addExposedHeader("*");
  56.         //放行的请求方式
  57. //        config.addAllowedMethod("GET");
  58. //        config.addAllowedMethod("PUT");
  59. //        config.addAllowedMethod("POST");
  60. //        config.addAllowedMethod("DELETE");
  61.         config.addAllowedMethod("*");     //放行全部请求
  62.         //是否发送Cookie
  63.         config.setAllowCredentials(true);
  64.         //2. 添加映射路径
  65.         UrlBasedCorsConfigurationSource corsConfigurationSource =
  66.                 new UrlBasedCorsConfigurationSource();
  67.         corsConfigurationSource.registerCorsConfiguration("/**", config);
  68.         //返回CorsFilter
  69.         return new CorsFilter(corsConfigurationSource);
  70.     }
  71. }
复制代码

  • 启动类
  1. package com.cc.go;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /** <p>启动类<p>
  5. * @since 2023/9/20
  6. * @author CC
  7. **/
  8. @SpringBootApplication
  9. public class GradleStartApplication {
  10.     public static void main(String[] args) {
  11.         SpringApplication.run(GradleStartApplication.class, args);
  12.     }
  13. }
复制代码

  • application.yml
  1. server:
  2.   port: 2222
复制代码
三、测试

1、传递依赖测试,在二实现中,已经验证了,能引入依赖

2、启动测试,测试业务模块的接口调用


  • 启动项目,模块启动

  • 接口调用

  • 调用后打印的

四、总结


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表