文章目录
- 创建Gradle项目
- dependencies.gradle
- gradle.properties
- build.gradle
- Gradle配置文件详解
- dependency-management 插件
- SpringBootPlugin 插件
- 多模块
- 热部署
创建Gradle项目
dependencies.gradle
ext.versions = [ // 定义所有要使用的版本号springboot: '2.4.1' // SpringBoot版本号
]
ext.libraries = [ // 定义所有的依赖库'spring-boot-gradle-plugin': "org.springframework.boot:spring-boot-gradle-plugin:${versions.springboot}"
]
gradle.properties
project_group=com.wyy
project_version=1.0.0
project_jdk=8
build.gradle
buildscript { // 定义脚本使用资源apply from: 'dependencies.gradle' // 引入所需要的依赖库文件repositories { // 脚本资源仓库maven { url 'https://maven.aliyun.com/repository/public' }}dependencies { // 依赖库classpath libraries.'spring-boot-gradle-plugin'}
}group project_group
version project_version
apply from: 'dependencies.gradle' // 引入所需要的依赖库文件
def env = System.getProperty("env") ?: 'dev' // 获取env环境属性subprojects { // 子模块apply plugin: 'java' // 引入之前的插件apply plugin: 'org.springframework.boot' // 引入之前的插件apply plugin: 'io.spring.dependency-management' // 引入之前的插件sourceCompatibility = project_jdk // 本次项目都是基于JDK-8版本编写的targetCompatibility = project_jdk // 本次项目都是基于JDK-8版本编写的repositories { // 配置Gradle仓库def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'all {ArtifactRepository repo ->if (repo instanceof MavenArtifactRepository) {def url = repo.url.toString()if (url.startsWith('https://repo1.maven.org/maven2')) {project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."remove repo}if (url.startsWith('https://jcenter.bintray.com/')) {project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."remove repo}}}maven { url ALIYUN_REPOSITORY_URL } // 设置阿里云仓库maven { url ALIYUN_JCENTER_URL } // 设置阿里云仓库}dependencies { // 公共依赖库管理compile('org.springframework.boot:spring-boot-devtools') // 允许进行项目的热部署}sourceSets { // 源代码目录配置main { // main及相关子目录配置java { srcDirs = ['src/main/java'] }resources { srcDirs = ['src/main/resources', "src/main/profiles/$env"] }}test { // test及相关子目录配置java { srcDirs = ['src/test/java'] }resources { srcDirs = ['src/test/resources'] }}}test { // 配置测试任务useJUnitPlatform() // 使用JUnit测试平台}// 最终生成的jar文件名称:baseName-version-classifier.extensiontask sourceJar(type: Jar, dependsOn: classes) { // 源代码的打包任务archiveClassifier = 'sources' // 设置文件的后缀from sourceSets.main.allSource // 所有源代码的读取路径}task javadocTask(type: Javadoc) { // JavaDoc文档打包任务options.encoding = 'UTF-8' // 设置文件编码source = sourceSets.main.allJava // 定义所有的Java源代码}task javadocJar(type: Jar, dependsOn: javadocTask) { // 先生成JavaDoc再打包archiveClassifier = 'javadoc' // 文件标记类型from javadocTask.destinationDir // 通过JavadocTask任务中找到目标路径}tasks.withType(Javadoc) { // 文档编码配置options.encoding = 'UTF-8' // 定义编码}tasks.withType(JavaCompile) { // 编译编码配置options.encoding = 'UTF-8' // 定义编码}artifacts { // 最终的打包的操作任务archives sourceJar // 源代码打包archives javadocJar // javadoc打包}gradle.taskGraph.whenReady { // 在所有的操作准备好后触发tasks.each { task -> // 找出所有的任务if (task.name.contains('test')) { // 如果现在发现有test任务// 如果将enabled设置为true表示要执行测试任务,如果设置为false表示不执行测试任务task.enabled = true}}}[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' // 编码配置
}
project('microboot-web') { // 子模块dependencies { // 配置子模块依赖compile(project(':microboot-common')) // 引入其他子模块compile('org.springframework.boot:spring-boot-starter-web') // 引入SpringBoot依赖}
}
project('microboot-common') { // 子模块dependencies {} // 配置子模块依赖
}
在 公共子模块 的 build.gradle 中添加如下配置
jar { enabled = true} // 允许打包为jar文件
bootJar { enabled = false } // 不允许打包为Boot执行文件
javadocTask { enabled = false } // 不需要打包为doc文件
Gradle仓库 也可以这样
repositories { // 配置Gradle仓库mavenLocal()maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }mavenCentral()jcenter()}
可以在 subprojects {} 子模块中加入 版本控制插件
dependencyManagement {// 版本控制插件imports {mavenBom libraries.'spring-cloud-dependencies' // SpringCloud依赖管理mavenBom libraries.'spring-cloud-alibaba-dependencies' // SpringCloudAlibaba依赖管理}}
公共依赖库管理 ( 但是需要在 dependencies.gradle 中加入 JUnit 和 lombok 依赖 )
dependencies { // 公共依赖库管理compile('org.springframework.boot:spring-boot-devtools') // 项目热部署// 以下为测试环境的相关依赖配置testImplementation('org.springframework.boot:spring-boot-starter-test') {exclude group: 'junit', module: 'junit' // 移除Junit4}testImplementation(enforcedPlatform(libraries.'junit-bom')) // 绑定为JUnit5运行testImplementation(libraries.'junit-platform-commons') // Junit5测试组件testImplementation(libraries.'junit-platform-engine') // Junit5测试组件testImplementation(libraries.'junit-jupiter-api') // Junit5测试组件testImplementation(libraries.'junit-vintage-engine') // Junit5测试组件testImplementation(libraries.'junit-jupiter-engine') // Junit5测试组件testImplementation(libraries.'junit-platform-launcher') // Junit5测试组件// 以下为Lombok插件的相关依赖配置compileOnly(libraries.'lombok') // 编译时生效annotationProcessor(libraries.'lombok') // 注解时生效}
上面为多模块开发,单模块时的 build.gradle ( 去掉subprojects {} ,但是保留里面配置项,repositories{} 有多种写法,dependencies{}中配置就不再是公共模块配置,而只是此依赖项 )
Gradle配置文件详解
初始
版本号
仓库
版本号管理
dependency-management 插件
但是如果采用的是此类的配置方式就会存在有一个比较麻烦的问题,因为在SpringBoot里面要引入的相关的
starters依赖库是非常多的(SpringBoot官方文档告诉大家的),就可能该变量会被引用无数次,这样的项目结构管理有些重复了,所以如果要想解决这个重复的SpringBoot-Xxx-Starter-Xxx依赖库的版本配置问题,那么最佳的做法就可以考虑引入一些插件
1、 【Maven 仓库】通过 Maven的中央仓库查询插件当前的版本号:
implementation group: 'io.spring.dependency-management", name: 'io.spring.dependency-management.gradle.plugin', version: '1.0.11.RELEASE', ext: 'pom'
2、【firstboot项目】修改build.gradle配置文件,设置插件的引用:
此时
可以去掉版本号
此时没有在项目之中引入依赖库的位置上继续进行版本号的定义,而是在顶部将所有的版本号都固定好了。
虽然这个时候已经合理的搭建了一个SpringBoot项目,但是依然有的同学会认为这样手工的配置形式实在是过于繁琐了,所以可以考虑直接利用Spring所给出的官方构建工具完成: start.spring.io
引入dependency-management 插件后,gradle会增加一些命令
此时存在有了一个bootJar任务,这个任务就是让当前的项目以SpringBoot方式运行: gradle bootRun,下面通过命令行的方式来基于此命令实现SpringBoot的运行:
在SpringBoot项目开发完成之后肯定要进行项目的打包处理,而在进行打包处理的时候,往往采用的默认命令: gradlebuild,但是在引入了SpringBoot 插件之后SpringBoot提供了一个默认的“bootJar”打包任务,所以就希望可以将build任务(iar任务)与bootRun (bootlar)合并在一起,既然有这样的要求,就可以考虑通过一个专属的插件来完成
SpringBootPlugin 插件
在配置文件最上方引入插件,并删掉此部分
加入这两个插件
修改写法
现在所有与SpringBoot有关的版本编号统一都交给了“spring-boot-gradle-plugin”来定义了,而后相关的任务也会自动的进行关联。
多模块
1、【IDEA工具】创建一个新的Gradle项目:microboot
2.【microboot项目】修改gradle.properties资源文件配置相关的项目属性:
3、【microboot项目】创建“dependecies.gradle”文件,这个文件实现所有项目之中依赖库版本的定义:
4、【microboot项目】修改build.gradle配置文件,引入相关的子配置文件:
改为
改 group、version、引入依赖库文件、配置子模块、env 是配合源代码测试和任务相关环境使用
子模块配置
subprojects { // 子模块apply plugin: 'java' // 引入之前的插件apply plugin: 'org.springframework.boot' // 引入之前的插件apply plugin: 'io.spring.dependency-management' // 引入之前的插件sourceCompatibility = project_jdk // 本次项目都是基于JDK-11版本编写的targetCompatibility = project_jdk // 本次项目都是基于JDK-11版本编写的repositories { // 配置Gradle仓库def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'all {ArtifactRepository repo ->if (repo instanceof MavenArtifactRepository) {def url = repo.url.toString()if (url.startsWith('https://repo1.maven.org/maven2')) {project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."remove repo}if (url.startsWith('https://jcenter.bintray.com/')) {project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."remove repo}}}maven { url ALIYUN_REPOSITORY_URL } // 设置阿里云仓库maven { url ALIYUN_JCENTER_URL } // 设置阿里云仓库}dependencies { // 公共依赖库管理}sourceSets { // 源代码目录配置main { // main及相关子目录配置java { srcDirs = ['src/main/java'] }resources { srcDirs = ['src/main/resources', "src/main/profiles/$env"] }}test { // test及相关子目录配置java { srcDirs = ['src/test/java'] }resources { srcDirs = ['src/test/resources'] }}}test { // 配置测试任务useJUnitPlatform() // 使用JUnit测试平台}// 最终生成的jar文件名称:baseName-version-classifier.extensiontask sourceJar(type: Jar, dependsOn: classes) { // 源代码的打包任务archiveClassifier = 'sources' // 设置文件的后缀from sourceSets.main.allSource // 所有源代码的读取路径}task javadocTask(type: Javadoc) { // JavaDoc文档打包任务options.encoding = 'UTF-8' // 设置文件编码source = sourceSets.main.allJava // 定义所有的Java源代码}task javadocJar(type: Jar, dependsOn: javadocTask) { // 先生成JavaDoc再打包archiveClassifier = 'javadoc' // 文件标记类型from javadocTask.destinationDir // 通过JavadocTask任务中找到目标路径}tasks.withType(Javadoc) { // 文档编码配置options.encoding = 'UTF-8' // 定义编码}tasks.withType(JavaCompile) { // 编译编码配置options.encoding = 'UTF-8' // 定义编码}artifacts { // 最终的打包的操作任务archives sourceJar // 源代码打包archives javadocJar // javadoc打包}gradle.taskGraph.whenReady { // 在所有的操作准备好后触发tasks.each { task -> // 找出所有的任务if (task.name.contains('test')) { // 如果现在发现有test任务// 如果将enabled设置为true表示要执行测试任务,如果设置为false表示不执行测试任务task.enabled = true}}}[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' // 编码配置
}
5、【microboot项目】创建一个“microboot-common”子模块,这是一个公共的模块,用于定义一些公共的程序类
在 公共子模块 的 build.gradle 中添加如下配置
jar { enabled = true} // 允许打包为jar文件
bootJar { enabled = false } // 不允许打包为Boot执行文件
javadocTask { enabled = false } // 不需要打包为doc文件
6、【microboot项目】创建一个“microboot-web”子模块,这个模块主要引用“microboot-common”子模块,并且实现WEB程序的开发
7、【microboot项目】修改build.gradle配置文件,进行子模块的定义
project('microboot-web') { // 子模块dependencies { // 配置子模块依赖compile(project(':microboot-common')) // 引入其他子模块compile('org.springframework.boot:spring-boot-starter-web') // 引入SpringBoot依赖}
}
project('microboot-common') { // 子模块dependencies {} // 配置子模块依赖
}
热部署
在进行java项目开发过程之中,最痛苦的一件事情就是每次修改之后都需要重新启动应用程序,所以此时就会感觉到非常非常的痛苦了,为了解决这个问题在SpringBoot里面就提供了一个所谓的热加载的机制,只要你的程序发生了变更,那么就会自动的进行SpringBoot容器的重新启动,而后加载新的配置。
1、【microboot项目】如果要想解决这种自动加载的问题,需要在项目之中引入一个""依赖库
2、【IDEA工具】如果你现在使用的是Eclipse(STS工具),只需要引入以上的依赖就可以实现自动的加载了,但是如果是在IDEA工具里面,则还需要进行一些配置:【File】【Settings】
3、【IDEA工具】仅仅配置以上的选项还不能够支持自动的部署处理,如果要想实现部署的自动配置,那么还需要在IDEA工具里面进行一些配置的注册,按下一个组合键:" CTRL + SHIFT + ALT + / "
4、【[IDEA工具】当所有的配置都已经完成之后,就需要重新启动IDEA 工具才可以实现自动的热部署
在每次代码修改并且保存之后都会自动的重新启动SpringBoot容器,实际上这个时候的启动并不是整个容器的重新启动,而是内部的部分程序类的启动。
实际上所谓的热部署本质上是将整个的类加载器进行了拆分,在没有引入“devtools”工具的时候,所有的系统类和用户的程序类都使用同一个类加载器进行加载,但是当引入了“devtools”工具的时候,系统类有系统类的加载器,而程序类有程序类的加载器,此时实际上就是程序类的加载器进行重新工作,重新启动,这样的启动要比整个项目的重新启动速度更快一些。