当前位置:   article > 正文

一文让你玩转Gradle_build.gradle.kts和build.gradle

build.gradle.kts和build.gradle

前言

背景介绍

Gradle是一个构建工具,面向开发者的脚本语言是GroovyKotlin,简而言之就是我们常用的build.gradle和build.gradle.kts或plugin等。

  • Groovy:主流语言,新建项目的时候,Groovy是默认的构建脚本语言
  • Kotlin:Gradle 5.0之后已经支持

在Gradle中,有大量配置都是通过脚本语言来写的,所以不管是Groovy还是Kotlin,最后的表现都是DSL(Domain Specific Language)

Gradle中的DSL

  1. # 声明引入Gradle插件plugin的DSL代码
  2. plugins {
  3. id 'java'
  4. id 'org.springframework.boot' version '2.5.3' apply 'false'
  5. }
  6. group 'org.example'
  7. version '1.0-SNAPSHOT'
  8. repositories {
  9. mavenCentral()
  10. }
  11. dependencies {
  12. testCompile group: 'junit', name: 'junit', version: '4.12'
  13. }

plugin 有id三个参数配置项:

  • id:调用的是PluginDependenciesSpec中的id(String id)函数,返回PluginDependencySpec对象,PluginDependencySpec对象可以理解为是PluginDependenciesSpec的一层封装,versionapply被封装在此对象中
  • version:插件的版本号,默认插件无须填写版本号,第三方插件需要填写版本号
  • apply:是否将插件应用于当前项目及子项目,默认是true,就是就是控制依赖传递的,当不想传递时可以设置为false

Kotlin写法

注意:只介绍引入包一种语法的不同之处

  1. plugins {
  2. id("com.android.application") version "7.3.0" apply false
  3. }

我们可以看出来,其实Kotlin DSLGroovy DSL的写法差别不大,也是调用PluginDependenciesSpec中的id(String id)函数,只不过差别在调用id(String id)函数时有显式的括号而已。

Gradle安装

下载安装包

从官网下载安装包,然后再本地解压:

配置系统环境变量

GRADLE_HOME:gradle压缩包解压后的目录
GRADLE_USER_HOME:gradle默认的仓库地址 Path:在末尾追加%GRADLE_HOME%/bin

测试

打开CMD命令窗口,输入gradle -v有如图输出,表示安装成功:

在IDEA内创建Gradle项目

Gradle项目结构

  1. settings.gradle 配置项目名,模块间的依赖
  2. build.gradle 配置项目groupId、version、依赖的gradle插件、jar包、jar仓库
  3. gradle/wrapper/gradle-wrapper.properties 配置当前项目使用的gradle软件版本、及下载目录
  4. build目录 项目打包的输出目录

编译打包

打开idea右侧的Gradle菜单,Tasks/build子菜单下有一组gradle指令,可以使用jar指令打包项目。打包结果输出在build目录:

Gradle配置国内的源

国内镜像感觉aliyun的比较全,最新地址如下:
developer.aliyun.com/mvn/view

在build.gradle中修改镜像地址配置:

  1. repositories {
  2. maven{ url 'https://maven.aliyun.com/repository/central' }
  3. maven{ url 'https://maven.aliyun.com/repository/public' }
  4. maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}
  5. }

注意:如果项目中引用了gradle plugin包,必须加入https://maven.aliyun.com/repository/gradle-plugin,不然在central仓库中找不到。如果有

maven 项目秒变Gradle项目

切到maven项目pom文件所在的目录,然后执行如下命令:

  1. #1.7写法
  2. gradle setupBuild --type pom
  3. #2.0写法
  4. gradle init --type pom

常用SpringBoot Gradle的配置案例

  1. /****************************************
  2. * gradle.properties
  3. * 各dependency的版本
  4. */
  5. springBootVersion = 2.0.3.RELEASE
  6. springVersion = 5.0.7.RELEASE
  7. protobufPluginVersion = 0.8.6
  8. protobufJavaVersion = 3.6.0
  9. grpcPluginVersion = 1.14.0 # same to grpcVersion
  10. grpcVersion = 1.14.0
  11. guavaVersion = 25.1-jre
  12. mysqlConnectorVersion = 6.0.6
  13. lombokVersion = 1.18.2
  14. /****************************************
  15. * repo配置
  16. * 相关nexus配置参见~/.gradle/gradle.properties: nexus.url nexus.username nexus.password
  17. */
  18. buildscript {
  19. // repositories for plugins in build script
  20. repositories {
  21. mavenLocal()
  22. maven {
  23. name "nexus"
  24. url property("nexus.url")
  25. credentials {
  26. username property("nexus.username")
  27. password property("nexus.password")
  28. }
  29. }
  30. }
  31. }
  32. // repositories for project dependencies
  33. repositories {
  34. mavenLocal()
  35. maven {
  36. name "nexus"
  37. url property("nexus.url")
  38. credentials {
  39. username property("nexus.username")
  40. password property("nexus.password")
  41. }
  42. }
  43. }
  44. /****************************************
  45. * SpringBoot基本配置
  46. */
  47. buildscript {
  48. dependencies {
  49. classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  50. }
  51. }
  52. apply plugin: 'org.springframework.boot'
  53. apply plugin: 'io.spring.dependency-management'
  54. // spring 2.+
  55. bootJar.archiveName="${project.name}-boot.jar"
  56. task('release', type: Copy) {
  57. dependsOn bootJar
  58. from("$buildDir/libs/") {
  59. include "${project.bootJar.archiveName}"
  60. }
  61. String date = "date +%Y%m%d".execute().text.trim()
  62. String baseDir = date + "_" + project.version
  63. String defaultDir = "/global/release/${project.name}/$baseDir"
  64. String dir = defaultDir
  65. if (project.hasProperty("dir")) {
  66. dir = project.property("dir")
  67. }
  68. into "$dir"
  69. doLast {
  70. println ". release into: ${project.release.destinationDir}/${project.bootJar.archiveName}"
  71. }
  72. }
  73. /****************************************
  74. * SpringBoot的Configuration Processor
  75. * 并将metadata.json拷贝到resources目录,以便在IDEA中起效
  76. */
  77. // copy spring-configuration-metadata.json when it's generated
  78. compileJava << {
  79. project.copy {
  80. from("${sourceSets.main.java.outputDir}/META-INF") {
  81. include "*.json"
  82. }
  83. into "src/main/resources/META-INF"
  84. }
  85. }
  86. // 依赖spring-boot-configuration-processor
  87. dependencies {
  88. // gradle 官方推荐的方式
  89. annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
  90. // 避免IDEA的警告,不过不加也没关系
  91. compileOnly("org.springframework.boot:spring-boot-configuration-processor")
  92. }
  93. /****************************************
  94. * 常用的java task
  95. */
  96. task sourcesJar(type: Jar, dependsOn: classes) {
  97. from sourceSets.main.allJava
  98. classifier = 'sources'
  99. doLast {
  100. println archivePath
  101. }
  102. }
  103. task javadocJar(type: Jar, dependsOn: javadoc) {
  104. classifier = 'javadoc'
  105. from javadoc.destinationDir
  106. doLast {
  107. println archivePath
  108. }
  109. }
  110. /****************************************
  111. * 输出task结果
  112. */
  113. jar << {
  114. println archivePath
  115. }
  116. test << {
  117. println reports.html.entryPoint
  118. }
  119. jacocoTestReport << {
  120. println reports.html.entryPoint
  121. }
  122. /****************************************
  123. * lombok
  124. */
  125. dependencies {
  126. // lombok,两种方式依赖都需要
  127. annotationProcessor("org.projectlombok:lombok:$lombokVersion")
  128. compileOnly("org.projectlombok:lombok:$lombokVersion")
  129. }
  130. /****************************************
  131. * proto module的配置
  132. */
  133. buildscript {
  134. dependencies {
  135. classpath "com.google.protobuf:protobuf-gradle-plugin:$protobufPluginVersion"
  136. }
  137. }
  138. apply plugin: "java-library"
  139. apply plugin: "com.google.protobuf"
  140. // protobuf setting
  141. protobuf {
  142. // change generated directory
  143. generatedFilesBaseDir = "$projectDir/gen/"
  144. def userhome = System.properties['user.home']
  145. plugins {
  146. // define a codegen plugin named as `naming`
  147. naming {
  148. path = "$userhome/.protobuf/naming.py"
  149. }
  150. grpc {
  151. artifact = "io.grpc:protoc-gen-grpc-java:$grpcPluginVersion"
  152. }
  153. }
  154. generateProtoTasks {
  155. ofSourceSet('main')
  156. // all() returns the collection of all protoc tasks
  157. all().each { task ->
  158. // Here you can configure the task by name of each codegen plugin
  159. // change output sub-directory to put all generated files together
  160. task.plugins {
  161. naming {
  162. outputSubDir = "java"
  163. }
  164. grpc {
  165. outputSubDir = "java"
  166. }
  167. }
  168. }
  169. }
  170. }
  171. clean {
  172. // remove protobuf generated files when clean
  173. delete protobuf.generatedFilesBaseDir
  174. }
  175. sourceSets {
  176. // add protobuf generated files into sourceSet automatically
  177. main.java.srcDir("${protobuf.generatedFilesBaseDir}/main/java")
  178. }
  179. apply plugin: 'idea'
  180. idea {
  181. module {
  182. // mark protobuf source directory as source root
  183. sourceDirs += sourceSets.main.proto.sourceDirectories
  184. }
  185. }
  186. task('protoZip', type: Zip) {
  187. from sourceSets.main.proto
  188. classifier = 'proto'
  189. doLast {
  190. println archivePath
  191. }
  192. }
  193. // publish proto zip if necessary
  194. afterEvaluate {
  195. project.publishing.publications {
  196. mavenJava(MavenPublication) {
  197. // 发布proto包
  198. artifact protoZip
  199. }
  200. }
  201. }
  202. // protobuf dependencies
  203. dependencies {
  204. // protobuf dependency
  205. api("com.google.protobuf:protobuf-java:$protobufJavaVersion")
  206. // grpc dependencies
  207. api("io.grpc:grpc-protobuf:$grpcVersion")
  208. api("io.grpc:grpc-stub:$grpcVersion")
  209. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/293454
推荐阅读
相关标签
  

闽ICP备14008679号