「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
简介
“maven-publish” 插件提供了发布Maven格式的功能。
“publishing” 插件创建一个类型为PublishingExtension名称为publishing的参数,这个参数里面提供了publications容器和repositories容器。”maven-publish” 依赖的是MavenPublication和MavenArtifactRepository。
引入插件
plugins {
id 'maven-publish'
}
Publications
描述一次发布的结构和配置,通过任务发布的仓库。
发布一个模块
目前支持的模块
Name | Provided By | Atfifacts |
---|---|---|
java | Java Plugin | jar file |
web | War Plugin | war file |
例子,构建内容和运行的依赖都来自Java插件
// build.gradle
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
from components.java 表示使用默认配置,生成jar文件
发布一个自定义构建内容
通过配置artifact明确的制定需要生成的内容,对于每一个自定义的构建内容,可以制定扩展名和分析信息(classifier),插件自身可以支持发布出去生成的文件是jar和war,但是这并不能满足所有的情况,所以可以自定义构建内容,比如:aar等等。怎么自定义呢?创建相应的任务以及在publications中使用artifact就可以了。
//没看懂
可以在artifact中指定要发布的文件的路径
// build.gradle
publishing {
publications {
maven(MavenPublication) {
artifact "$buildDir/outputs/aar/module_rent-debug.aar"//工程打包生成的aar
}
}
}
POM属性
生成的POM文件的值包含了如下的属性:
- groupId Project.getGroup()
- artifactId Project.getName()
- version Project.getVersion()
// build.gradle
publishing {
publications {
maven(MavenPublication) {
groupId 'org.gradle.sample'
artifactId 'project1-sample'
version '1.1'
from components.java
}
}
}
修改生成的POM文件
// build.gradle
publications {
mavenCustom(MavenPublication) {
pom.withXml {
asNode().appendNode('description',
'A demonstration of maven POM customization')
}
}
}
上面例子在生成的POM文件中增加了一个description元素。使用hook可以修改POM中任意的元素。例如:你可以将依赖关系的版本范围替换成生成构建的实际版本。
可以修改POM中的任意元素,这也意味着可以将POM修改成非法的POM,所以需要小心的使用这个功能。
发布模块的唯一标识属性(groupId,artifactId,version)是一个例外,这个元素不能通过withXMLhook来修改。
发布多个模块
task apiJar(type: Jar) {
baseName "publishing-api"
from sourceSets.main.output
exclude '**/impl/**'
}
publishing {
publications {
impl(MavenPublication) {
groupId 'org.gradle.sample.impl'
artifactId 'project2-impl'
version '2.3'
from components.java
}
api(MavenPublication) {
groupId 'org.gradle.sample'
artifactId 'project2-api'
version '2'
artifact apiJar
}
}
}
如果一个工程定义了多个发布信息,Gradle会将每一个发布信息发布到指定的仓库。每一个发布需要给定一个唯一的标示。
Repositories
发布信息(Publications)最终会发布到仓库,发布的仓库信息定义在PublishingExtension.getRepositories()中。
// build.gradle
publishing {
repositories {
maven {
// change to point to your repo, e.g. http://my.org/repo
url "$buildDir/repo"
}
}
}
发布到maven仓库的例子
// build.gradle
apply plugin: 'java'
apply plugin: 'maven-publish'
group = 'org.gradle.sample'
version = '1.0'
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
publishing {
repositories {
maven {
// change to point to your repo, e.g. http://my.org/repo
url "$buildDir/repo"
}
}
}
打包android library到本地的例子
// android-artifacts.gradle
apply plugin: "maven-publish"
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
classpath += files(ext.androidJar)
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
afterEvaluate { project ->
tasks.all { Task task ->
if (task.name.equalsIgnoreCase('publishPatchLibPublicationToMavenLocal')) {
task.dependsOn tasks.getByName('assemble')
}
}
}
publishing {
publications {
PatchLib(MavenPublication) {
artifactId project.getName()
groupId group
version version
// artifact 打成aar
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
artifact androidJavadocsJar
}
}
}
// publish«PUBNAME»PublicationToMavenLocal
task pushlishLibToLocal(dependsOn: ['build', 'publish PatchLibPublicationToMavenLocal']) {
group = 'patch'
}
\
\
完整的例子
1.在module配置了多个渠道
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
//配置多个渠道
productFlavors {
cqtest {
dimension = "full"
}
pre {
dimension = "full"
}
dev {
dimension = "full"
}
}
}
在module的build.gradle同级创建maven_push.gradle,添加如下内容:
apply plugin: 'maven-publish'
publishing {
publications {
//重庆测试环境
cqtest(MavenPublication) {//cqtest即为渠道的名称,可以随意取
groupId = 'cn.companyname'//公司域名
artifactId = 'lib-mycar-cqtest'//该aar包的名称
version = '1.0.6'//版本号
def projectName = project.getName()
artifact "build/outputs/aar/mycar-cqtest-release.aar"//对应该渠道打包出来的aar所在的目录(如何打包请往下看)
pom.withXml{
def dependenciesNode = asNode().appendNode("dependencies")
configurations.implementation.allDependencies.forEach(){
Dependency dependency ->
if (dependency.version != "unspecified" && dependency.name != "unspecified"){
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dependency.group)
dependencyNode.appendNode('artifactId', dependency.name)
dependencyNode.appendNode('version', dependency.version)
}
}
}
}
//开发环境
dev(MavenPublication) {
groupId = 'cn.companyname'
artifactId = 'lib-mycar-dev'
version = '1.0.6'
def projectName = project.getName()
artifact "build/outputs/aar/mycar-dev-release.aar"
pom.withXml{
def dependenciesNode = asNode().appendNode("dependencies")
configurations.implementation.allDependencies.forEach(){
Dependency dependency ->
if (dependency.version != "unspecified" && dependency.name != "unspecified"){
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dependency.group)
dependencyNode.appendNode('artifactId', dependency.name)
dependencyNode.appendNode('version', dependency.version)
}
}
}
}
//预发布环境
pre(MavenPublication) {
groupId = 'cn.companyname'
artifactId = 'lib-mycar-pre'
version = '1.0.6'
def projectName = project.getName()
artifact "build/outputs/aar/mycar-pre-release.aar"
pom.withXml{
def dependenciesNode = asNode().appendNode("dependencies")
configurations.implementation.allDependencies.forEach(){
Dependency dependency ->
if (dependency.version != "unspecified" && dependency.name != "unspecified"){
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dependency.group)
dependencyNode.appendNode('artifactId', dependency.name)
dependencyNode.appendNode('version', dependency.version)
}
}
}
}
}
repositories {
maven {
//maven仓库的地址
url = "http://nexus.isuanyun.com/repository/maven-public/"
//仓库的用户名及密码
credentials {
username ''
password ''
}
//👇这是一个本地仓库地址即D盘的maventestrepository文件夹,可以用来测试发布aar包,发布之后的aar将存放于该地址
//url = "file://d:/maventestrepository"
}
}
}
在build.gradle中添加如下内容
apply from: 'maven_push.gradl'
\