Gradle笔记 七 publishing 项目发布

举报
未来日记 发表于 2023/12/27 09:18:56 2023/12/27
【摘要】 build.gradle 文件● build.gradle 是一个gradle 的构建脚本文件,支持java、groovy 等语言。● 每个project 都会有一个build.gradle 文件,该文件是项目构建的入口,可配置版本、插件、依赖库等信息。● 每个build 文件都有一个对应的 Project 实例,对build.gradle 文件配置,本质就是设置Project 实例的属性...

build.gradle 文件

● build.gradle 是一个gradle 的构建脚本文件,支持java、groovy 等语言。
● 每个project 都会有一个build.gradle 文件,该文件是项目构建的入口,可配置版本、插件、依赖库等信息。
● 每个build 文件都有一个对应的 Project 实例,对build.gradle 文件配置,本质就是设置Project 实例的属性和方法。
● 由于每个 project 都会有一个build 文件,那么Root Project 也不列外.Root Project 可以获取到所有 Child Project,所以在Root Project 的 build 文件中我们可以对Child Project 统一配置,比如应用的插件、依赖的maven 中心仓库等。
● build 文件中常见的属性和方法如下所示:
image.png

常见属性代码

代码参考:

//指定使用什么版本的JDK语法编译源代码,跟编译环境有关,在有java插件时才能用
sourceCompatibility = 1.8
//指定生成特定于某个JDK版本的class文件:跟运行环境有关,在有java插件时才能用
targetCompatibility = 1.8
//业务编码字符集,注意这是指定源码解码的字符集[编译器] 
compileJava.options.encoding "UTF-8"
//测试编码字符集,注意这是指定源码解码的字符集[编译器] 
compileTestJava.options.encoding "UTF-8"
//编译JAVA文件时采用UTF-8:注意这是指定源码编码的字符集【源文件】t
asks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//编译JAVA文件时采用UTF-8:注意这是指定文档编码的字符集【源文件】
tasks.withType(Javadoc) {
options.encoding = "UTF-8"
}

提示 1:group+name+version 类似于 maven 的group+artifactId+version
提示 2:encoding 解决业务代码与测试代码中文乱码问题

Repositories

repositories {
//gradle中会按着仓库配置的顺序,从上往下依次去对应的仓库中找所需要的jar包:
//如果找到,则停止向下搜索,如果找不到,继续在下面的仓库中查找
//指定去本地某个磁盘目录中查找:使用本地file文件协议:一般不用这种方式
maven { url 'file:///D:/repos/mavenrepos3.5.4'}
maven { url "$rootDir/lib/release" }
//指定去maven的本地仓库查找
mavenLocal()
//指定去maven的私服或者第三方镜像仓库查找
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } 
maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
//指定去maven的远程仓库查找:即 https://repo.maven.apache.org/maven2/
mavenCentral()
//去google仓库查找
google()
}

因为 Gradle 没有自己的远程仓库,而是使用 Maven、jcenter、jvy、google 这些远程仓库。

Subprojects 与 Allprojects

allprojects 是对所有project(包括Root Project+ child Project[当前工程和所有子工程])的进行统一配置,而subprojects是对所有Child Project 的进行统一配置。
测试如下:

allprojects {
    tasks.create('hello') { doLast {
    task ->
        println "project name is $task.project.name"
}
}
}
subprojects {
hello.doLast{ 
    task->
    println "here is subprojects $task.project.name"
}
}

通常在 subprojects 和allprojects 中:

allprojects(){ //本质Project中的allprojects方法,传递一个闭包作为参数。
apply plugin: 'java'
ext {
junitVersion = '4.10'
..
}
task allTask{
...
}
repositories {
...
}
dependencies {
...
}
}
subprojects(){//同上面allprojects中的方法。
}

拓展 1: 如果是直接在根project 配置 repositories 和 dependencies 则只针对根工程有效。拓展:我们也可以在对单个 Project 进行单独配置:

project('subject01') {
task subject01 {
doLast {
println 'for subject01'
}
}
}

ext 用户自定义属性

Project 和 Task 都允许用户添加额外的自定义属性,要添加额外的属性,通过应用所属对象的ext 属性即可实现。添加之后可以通过 ext 属性对自定义属性读取和设置,如果要同时添加多个自定义属性,可以通过 ext 代码块:

//自定义一个Project的属性
ext.age = 18
//通过代码块同时自定义多个属性
ext {
phone = 19292883833
address="北京onenewcode"
}
task extCustomProperty {
//在task中自定义属性
ext {
desc = "奥利给"
}
doLast {
println " 年 龄 是 :${age}" println "电话是:${phone}" println "地址是:${address}" println "onenewcode:${desc}"
}
}

测试:通过 gradle extCustomProperty

输出结果为:


年龄是:18
电话是:19292883833
地址是:北京onenewcodeonenewcode:奥利给

拓展 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)
}
}

需要注意的是:

  1. buildscript{}必须在 build.gradle 文件的最前端。
  2. 对于多项目构建,项目的 buildscript ()方法声明的依赖关系可用于其所有子项目的构建脚本。
  3. 构建脚本依赖可能是 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 自动回调完成的,利用这些钩子函数可以帮助我们实现一些我们想要的功能。

image.png

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 方法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。