- 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创建完整模块的方式也是可行的,只要注意被引用模块的打包方式即可。缺点是每个模块都有一套完整的配置信息,管理起来比较混乱。 本文为最基本的配置,更复杂的配置,需要确定好适用范围,放到正确的配置区域即可。
来源:oschina
链接:https://my.oschina.net/u/580483/blog/4277257