最近准备把项目从maven迁移到gradle。由于之前也没接触过gradle,中途也遇到了一些坑,这里记录一下供后来者参考,适合gradle新手小白参考。后续如果有其他gradle相关问题也会继续更新。
这里的版本采用的是6.7。环境安装参考官方文章,通过gradle -version 判断环境是否正确。
如何使用全局参数
在gradle.properties中可以定义全局参数,如以下:
springBootVersion=2.3.6.RELEASE
在build.gradle中通过${xxx}引用:
...
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
...
父子项目工程如何定义
这里定义了一个demo-core,目录结构如下:
/demo-core
/demo-core-common
build.gradle
/demo-core-service
build.gradle
build.gradle
settings.gradle
gradle.properties
在setting.gradle中定义子项目包名
rootProject.name = 'demo-core'
include 'demo-core-common'
include 'demo-core-service'
在顶层的build.gradle可以通过subprojects,设置全局子项目的配置
subprojects {
apply plugin: 'java'
apply plugin: 'idea'
group = 'com.lwtxzwt'
version = '1.0.0-SNAPSHOT'
sourceCompatibility = 11
targetCompatibility = 11
repositories {
mavenLocal()
maven { url 'http://xxx.xxx.xxx/repository/maven-public/' }
mavenCentral()
}
jar {
enabled = true
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
}
如何上传到私服仓库
这里我们需要将demo-core-common打包上传到私服仓库,配置demo-core-common目录下的build.gradle
apply plugin: 'java'
apply plugin: 'maven'
uploadArchives {
repositories {
def nexusUrl = '这里配置maven的仓库'
mavenDeployer {
def releasesRepoUrl = "$nexusUrl/repository/maven-releases/"
def snapshotsRepoUrl = "$nexusUrl/repository/maven-snapshots/"
repository(url: version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl) {
authentication(userName: "$mavenUser", password: "$mavenPassword")
}
}
}
}
这样在gradle的task中就会出现upload,也可以通过upload命令上传。
如何在service中依赖common的jar
我们需要在demo-core-service中依赖demo-core-common的jar包,配置demo-core-service
dependencies {
implementation project(':demo-core-common')
...
}
外部依赖更新后,本地未生效
当外部依赖的代码更新后,本地未生效。这是由于gradle存在缓存机制,需要关闭缓存机制,或者删除本地jar包,才会触发更新。这里将缓存期限设置为0,每次运行都会重新下载依赖。
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
implementation和api的区别
implementation 表示依赖,即只依赖不打包进来。个人理解有点类似maven中的optional设置为true。
api 表示打包,即不仅依赖还打包进来,这样上层就不用重复依赖。
compileOnly编译时可用
compileOnly 表示编辑时用,即不参与打包。最经典的例子就是lombok,一般配合annotationProcessor使用。
annotationProcessor 表示用于注解处理器的依赖配置。不太常用,目前只在lombok中用到。
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.16'
annotationProcessor 'org.projectlombok:lombok:1.18.16'
}
gradle插件
类似maven的插件,gradle也提供了很多基础功能插件。
- 做maven上传到私服时,我们就用了maven的插件’maven’。
- 当应用’io.spring.dependency-management’插件的时候,Spring Boot插件将自动从使用的Spring
Boot版本导入spring-boot-dependencies,你可以省略bom中声明依赖的版本号。 - 对于IDE的插件’idea’或者’eclipse’等。
其他更多插件可以到官方查阅:https://plugins.gradle.org