Gradle实战及Maven项目迁移采坑记录

最近准备把项目从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命令上传。
Gradle实战及Maven项目迁移采坑记录

如何在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

上一篇:SpringBoot+Dubbo+Zookeeper 实例


下一篇:最大公约数 最小公倍数