Gradle笔记 七 publishing 项目发布(一)https://developer.aliyun.com/article/1391984
拓展 1: ext 配置的是用户自定义属性,而gradle.properties 中一般定义 系统属性、环境变量、项目属性、JVM 相关配置信息。例如gradle.properties 文件案例:加快构建速度的,gradle.properties 文件中的属性会自动在项目运行时加载。
## 设置此参数主要是编译下载包会占用大量的内存,可能会内存溢出 org.gradle.jvmargs=-Xms4096m-Xmx8192m ## 开启gradle缓存 org.gradle.caching=true #开启并行编译 org.gradle.parallel=true #启用新的孵化模式 org.gradle.configureondemand=true #开启守护进程 org.gradle.daemon=true
Buildscript
buildscript 里是gradle 脚本执行所需依赖,分别是对应的 maven 库和插件。案例如下:
import org.apache.commons.codec.binary.Base64 buildscript { repositories { mavenCentral() } dependencies { classpath group: 'commons-codec', name: 'commons-codec', version: '1.2' } } tasks.register('encode') { doLast { def byte[] encodedString = new Base64().encode('hello world\n'.getBytes()) println new String(encodedString) } }
需要注意的是:
- buildscript{}必须在 build.gradle 文件的最前端。
- 对于多项目构建,项目的 buildscript ()方法声明的依赖关系可用于其所有子项目的构建脚本。
- 构建脚本依赖可能是 Gradle 插件。
案例如下所示:
//老式apply插件的引用方式,使用apply+buildscript buildscript { ext { springBootVersion = "2.3.3.RELEASE" } repositories { mavenLocal() maven { url 'http://maven.aliyun.com/nexus/content/groups/public' } jcenter() } //此处引入插件 dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' //核心插件,无需事先引入 apply plugin:
org.springframework.boot
社区插件,需要事先引入,才能应用,不必写版本号
publishing 项目发布
接下来,将咱们写好的模块发布发布到公司的私服以供别人使用,如下所示:
引入maven 发布的插件
plugins { id 'java-library' //如果发布war包,需要war插件,java-library支持带源码、文档发布 id 'maven-publish' }
设置发布代码
//带源码和javadoc的发布:需要'java-library'插件支持:它是java的升级版,java插件的功能java-library都有 //javadoc.options.encoding="UTF-8" //java{ // withJavadocJar() // withSourcesJar() //} publishing{ publications{ myLibrary(MavenPublication){ groupId='org.gradle.sample'//指定GAV坐标信息 artifactId='library' version='1.1' fromcomponents.java//发布jar包 //fromcomponents.web///引入war插件,发布war包 } } repositories{ //本地仓库位于USER_HOME/.m2/repository mavenLocal() //发布项目到私服中 maven{ name='myRepo'//name属性可选,表示仓库名称,url必填 //发布地址:可以是本地仓库或者maven私服 //url=layout.buildDirectory.dir("repo") //changeURLstopointtoyourrepos,e.g.http://my.org/repo defreleasesRepoUrl=layout.buildDirectory.dir('repos/releases') defsnapshotsRepoUrl=layout.buildDirectory.dir('repos/snapshots') url=version.endsWith('SNAPSHOT')?snapshotsRepoUrl:releasesRepoUrl //认证信息:用户名和密码 // credentials{ // username='joe' // password='secret' // } } } }
执行发布指令
执 行 发 布 命 令 , 将 项 目 发 布 到 本 地 仓 库 或 者 远 程 仓 库 。 常 见 的 发 布 指 令 有 :
- generatePomFileForPubNamePublication: 生成 pom 文件
- publishPubNamePublicationToRepoNameRepository:发布项目到指定仓库,如果没有仓库名,默认为maven
- publishPubNamePublicationToMavenLocal: 将 PubName 发布复制到本地 Maven 仓库中包括POM 文件和其他元数据。
- publish: 发布到 repositories 中指定的仓库(为比如 Maven 私服)
- publishToMavenLocal: 执行所有发布任务中的操作发布到本地 maven 仓库
生命周期中Hook
生命周期中的这些钩子函数都是由 gradle 自动回调完成的,利用这些钩子函数可以帮助我们实现一些我们想要的功能。
Gradle 在生命周期各个阶段都提供了用于回调的钩子函数:
Gradle 初始化阶段:
● 在 settings.gradle 执行完后,会回调 Gradle 对象的 settingsEvaluated 方法
● 在构建所有工程 build.gradle 对应的Project 对象后,也既初始化阶段完毕,会回调 Gradle 对象的projectsLoaded 方法
Gradle 配置阶段:
● Gradle 会循环执行每个工程的 build.gradle 脚本文件
● 在执行当前工程build.gradle 前,会回调Gradle 对象的 beforeProject 方法和当前Project 对象的 beforeEvaluate 方法, 虽然 beforeEvalute 属于 project 的生命周期, 但是此时 build script 尚未被加载, 所以 beforeEvaluate 的设置依 然要在 init script 或 setting script 中进行,不要在 build script 中使用 project.beforeEvaluate 方法。
● 在执行当前工程 build.gradle 后,会回调 Gradle 对象的afterProject 方法和当前Project 对象的 afterEvaluate 方法
● 在所有工程的 build.gradle 执行完毕后,会回调 Gradle 对象的 projectsEvaluated 方法
● 在构建 Task 依赖有向无环图后,也就是配置阶段完毕,会回调TaskExecutionGraph 对象的 whenReady 方法
Gradle 执行阶段:
● Gradle 会循环执行Task 及其依赖的 Task
● 在当前 Task 执行之前,会回调 TaskExecutionGraph 对象的 beforeTask 方法
● 在当前 Task 执行之后,会回调 TaskExecutionGraph 对象的 afterTask 方法当所有的 Task 执行完毕后,会回调 Gradle 对象的 buildFinish 方法。