springboot+gradle多模块项目分离打包分离jar配置文件

标题

  • 为什么使用gradle而不是maven
  • 分离打包有什么优势
  • 展示gradle多模块构建
    • 目录结构
    • settings.gradle文件配置
    • 父模块,build.gradle配置
    • 公共模块common build.gradle配置
    • framework模块build.gradle配置
    • api模块build.gradle配置
  • yml配置文件需要注意
  • 最后打包出来的结构
    • lib包中包含了所有的jar包

为什么使用gradle而不是maven

对于开发者而言,maven与gradle带来的实际体验是一样的。因为我们只关注实际的业务开发!这里举例两个我放弃maven的两个点!
1、我需要完成分离jar包的打包方式,而maven的插件始终下载不下来
2、gradle的构建速度确实比maven快

分离打包有什么优势

当我们需要频繁更新项目到生产环境时发现,每次都需要更新很大的jar包,所以我们把一些基础的依赖分离出来!这样我们每次只要更新代码的jar包只有几百KB!在频繁的更新也不慌了

展示gradle多模块构建

目录结构

springboot+gradle多模块项目分离打包分离jar配置文件_第1张图片

settings.gradle文件配置

rootProject.name = 'twice-issue'
include 'common'
include 'framework'
include 'api'
include 'generator'

父模块,build.gradle配置

// 插件配置,这里指定插件的下载路径
buildscript {
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/repository/public/' }
        mavenCentral()
    }
}
// 需要引入的插件 apply
plugins {
    id 'java'
    id 'org.springframework.boot' version '2.4.1' apply false
    id 'io.spring.dependency-management' version '1.0.11.RELEASE' apply false
}
// 子项目配置
subprojects {
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'idea'

    group 'com.mc'
    version '0.1'

    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/repository/public/' }
        mavenCentral()
    }
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.boot:spring-boot-starter-test'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
    }
}

公共模块common build.gradle配置

jar.enabled = true
bootJar.enabled = false

dependencies {
    api 'org.springframework.boot:spring-boot-starter-jdbc'
    api 'org.springframework.boot:spring-boot-starter-validation'
    api 'org.springframework.boot:spring-boot-starter-security'
    api 'org.springframework.boot:spring-boot-starter-data-redis'
    api 'com.baomidou:mybatis-plus-boot-starter:3.4.1'
    api 'mysql:mysql-connector-java:8.0.22'
    // 解决springfox-boot-starter打包后缺失org\mapstruct\factory\Mappers问题
    api 'org.mapstruct:mapstruct:1.4.1.Final'
    api 'io.springfox:springfox-boot-starter:3.0.0'
    api 'com.github.xiaoymin:knife4j-spring-ui:3.0.2'
    api 'com.alibaba:fastjson:1.2.75'
}

framework模块build.gradle配置

jar.enabled = true
bootJar.enabled = false

dependencies {
    api project(':common')
}

api模块build.gradle配置

dependencies {
    implementation project(':framework')
}

// 将依赖包复制到lib目录
task copyJar(type: Copy) {
    // 清除现有的lib目录
    delete "$buildDir/libs/lib"
    from configurations.compileClasspath
    into "$buildDir/libs/lib"
}
// 拷贝配置文件
task copyConfigFile(type: Copy) {
    // 清除现有的配置目录
    delete "$buildDir\\libs\\config"
    from 'src/main/resources'
    into 'build/libs/config'
}
// 依赖jar包与主程序分离式打包
bootJar {
    // 引入需要的文件
    includes = [
            "common-${project.version}.jar",
            "framework-${project.version}.jar",
            "com/mc/api/**",
            "logback.xml",
    ]
    // 打包mapper xml文件
    processResources {
        from('src/main/java') {
            include '**/*.xml'
        }
    }
    // 拷贝文件到lib
    dependsOn copyJar
    dependsOn copyConfigFile
    // 指定依赖包的路径
    manifest {
        attributes 'Class-Path': project.configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ')
    }
}

yml配置文件需要注意

使用gradle指定xml文件时需要指定具体路径不能用**代替!这里我也没深入研究其原因
示例:

mybatis-plus:
  # mapper.xml 文件路径(需指定具体路径不可用**替代)
  mapper-locations: classpath:/com/mc/api/mapper/xml/*Mapper.xml

最后打包出来的结构

lib包中包含了所有的jar包

springboot+gradle多模块项目分离打包分离jar配置文件_第2张图片

你可能感兴趣的:(后端,gradle,java,spring,boot,jar,maven)