SpringBoot多模块项目(Gradle篇)

坚强是说给别人听的谎言 提交于 2020-10-04 22:26:58
  • Gradle Kotlin DSL

项目链接:https://gitee.com/ellipse/springboot-multi-parent

1、创建项目

1.1、创建根项目 (parent)

1、使用Spring Initializr创建一个项目

2、删除src

3、修改build.gradle.kts文件,将以下内容移到subprojects里面:

java.sourceCompatibility
dependencies
tasks

简单来说就是把除plugins group version repositories之外的东西都移到subprojects里面

4、将以下内容放在subprojects最前面

subprojects {
  apply(plugin = "java")
  apply(plugin = "kotlin") // 可选
  apply(plugin = "org.springframework.boot")
  apply(plugin = "io.spring.dependency-management")
  ......
}

5、springboot插件后添加apply false

plugins {
  id("org.springframework.boot") version "2.2.7.RELEASE" apply false
  ......
}

6、禁止根项目一切行为(不影响模块)

tasks.forEach {
  it.enabled = false
}

禁用以后执行build的时候不会构建parent项目

1.2、创建模块1 (core)

1、在根目录创建文件夹core

2、在core文件夹下创建空白构建文件build.gradle.kts

3、修改根项目的settings.gradle.kts文件,添加

include("core")

4、修改core模块的build.gradle.kts,以标准jar形式打包,方法见下文或源码。

1.3、创建模块2 (web)

1、在根目录创建文件夹web

2、在web文件夹下创建空白构建文件build.gradle.kts

3、修改根项目的settings.gradle.kts文件,添加

include("web")

4、添加core模块依赖。修改web模块的构建文件,添加

dependencies {
  implementation(project(":core"))
}

注意模块名前面有"冒号"。嵌套文件夹内的模块也要用"冒号"相连,不能用"斜杠"。

1.4、编写测试代码

1、在core模块下创建Model类 2、在web模块下创建Application和Controller类 3、启动无报错,接口可访问。测试通过

项目链接:https://gitee.com/ellipse/springboot-multi-parent

2、错误描述

2.1、项目build失败

Execution failed for task ':bootJar'.
> Main class name has not been configured and it could not be resolved

原因:根项目需禁用springboot插件。见1.1.5

2.2、core模块build失败

Execution failed for task ':core:bootJar'.
> Main class name has not been configured and it could not be resolved

原因:core模块需禁用springboot插件。见3.2

2.3 运行Application报错

ExampleController.java:3: 错误: 找不到符号
import org.misty.springboot.multi.Entity;
                                 ^
  符号:   类 Entity
  位置: 程序包 org.misty.springboot.multi

原因:core模块build失败。同2.2

2.4 Unresolved reference: developmentOnly

spring升级到2.3以后出现这个问题。升级后的一个变化是,原来gradle文件内的val developmentOnly by configurations.creating没有了。 但如果把以前那段代码拷过来又会报新的错误Cannot add a configuration with name 'developmentOnly' as a configuration with that name already exists.,即developmentOnly重复了。

解决方法:

  id("org.springframework.boot") version "2.3.0.RELEASE" apply false

移除根项目配置中的apply false。 猜测是因为springboot插件中定义了developmentOnly,但解析根项目的gradle文件是在根项目的上下文中,因此需要在根项目中应用这个插件。

3、Gradle打标准jar包

3.1、方法1

去掉spring-boot-gradle-plugin插件

  id("org.springframework.boot") version "2.2.7.RELEASE" // 删除这行
  • 移除插件后,必须手动添加spring-boot相关依赖的版本号,否则无法找到依赖包

3.2、方法2

网上还搜到下面这种写法。这是GroovyDSL的写法,对KotlinDSL无效。

bootJar {
  enabled = false
}

由于半天找不到KotlinDSL的用法,想着干脆找spring-boot-gradle-plugin源码看看吧。正巧源码文件夹里有个docs,里面有很多示例。

// 放在需要打标准jar包的模块的配置里
// 类型安全的写法
import org.springframework.boot.gradle.tasks.bundling.BootJar
import org.gradle.jvm.tasks.Jar

tasks.named<BootJar>("bootJar") {
  enabled = false
}
// 光禁用BootJar是不行的,还要启用Jar。
tasks.named<Jar>("jar") {
  enabled = true
}
// 简化的写法
tasks.bootJar {
  enabled = false
}

tasks.jar {
  enabled = true
}

4、子模块专属配置的两种方式

1、子模块自己的build.gradle.kts文件 2、根项目的build.gradle.kts文件内添加

project(":core") {
}

实验证明用IDE创建完整模块的方式也是可行的,只要注意被引用模块的打包方式即可。缺点是每个模块都有一套完整的配置信息,管理起来比较混乱。 本文为最基本的配置,更复杂的配置,需要确定好适用范围,放到正确的配置区域即可。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!