Android Gradle入门到精通(三)

1.引言

gradle除了自定义gradle插件之外,还能将module打成aar/jar 供其他的module使用。module A中 以引入aar包的形式,引进demo.aar 。将module A打包成aar之后。并不包含demo.aar代码。如何让moduleA 包含demo.aar 的代码呢?这就是我们本章要学习的

2.正题

moduleA 打包成aar ,如何能把demo.aar引入到moduleA.aar中呢? 答案就是:demo.aar必须通过本地/远程仓库的形式,引入到moduleA中
本节主要学习:

2.1 android module发布到本地仓库


apply plugin: 'maven-publish'

//将源码也放进仓库,这样能查看到源码
task packageJarAfterAssem(type:Jar,dependsOn: 'build'){
    archiveClassifier.set('sources')
 //E:\baidu\demo\AarTest\library3\src\main\java
    String path =android.sourceSets.main.java.srcDirs 
    System.out.println("path: "+path)
    from path
}

afterEvaluate {
    publishing {
        publications {
            test(MavenPublication) {
                groupId = 'com.example.library3'
                artifactId = 'final'
                version = '1.2'
                artifacts {
                    artifact packageJarAfterAssem
                    String filePath="$buildDir/outputs/aar/${project.getName()}-debug.aar"
                    if (new File(filePath).exists()){
                        artifact filePath
                    }
                }
            }
        }
        repositories {
            //本地仓库
            maven {
                url = "file://d:/mavenrepository2"  //本地仓库
            }
            //远程仓库
            maven {
               credentials {
                username '***'
                password '***'
            }
            url 'http://maven.*****:8081/nexus/content/repositories/releases/'}
        }
    }
}

接下来对上面的代码一点一点的分析:
task packageJarAfterAssem 是自定义task, Task的类型的Jar; dependsOn: 'build'表示在执行packageJarAfterAssem之前,先得执行build 任务 这样能保证产出module的jar/aar 。通过查看build-->out-->aar/jar

  • archiveClassifier
    类分拣器。属于Task中的一个变量。Task的类型是Jar。
archiveClassifier.set('sources2')

表示:给jar名称后面新增一个 "sources2"。影响到最终生成jar的名称。

  • from path

from是Jar的一个方法,path是java代码的路径。表示:将path下面的java代码打包,生成以sources2结尾的jar包

  • test(MavenPublication)
    语法意义:声明一个名为test的MavenPublication对象。名称可以随便取。这个名称主要影响的是gradle上的名字:


    1111.png

generatePomFileForPubNamePublication
为名为PubName的发布创建一个POM文件,填充已知元数据,如项目名称、项目版本和依赖项。生成的POM文件默认放在 build/publications/$pubName/pom-default.xml

publishPubNamePublicationToRepoNameRepository
将名为PubName的发布发布到名为RepoName的存储库中。如果您有一个没有显式名称的存储库定义,那么RepoName将是Maven。

publishPubNamePublicationToMavenLocal
将PubName发布复制到本地Maven缓存—通常是$USER_HOME/.m2/repository——连同发布的POM文件和其他元数据一起。
publish:
依赖于所有publishPubNamePublicationToRepoNameRepository任务。将所有已定义的发布发布到所有已定义存储库的聚合任务。它不包括将发布复制到本地Maven缓存。
publishToMavenLocal
依赖于所有publishPubNamePublicationToMavenLocal任务。将所有已定义的发布复制到本地Maven缓存,包括它们的元数据(POM文件等)。

以下是必填项:

 groupId = "cn.com.jack"
 artifactId = "mavendemo"
 version = versionName

平常通过implementation 引入的jar就是通过上面定义的名称。


  • artifact
    artifact属于 MavenPublication的方法。作用是将 "产物"放入到仓库。artifacts是一个集合,可以包含若干artifact
    artifact 后面的参数能是一个Task,也可以是一个路径。但是并不是所有的Task都能作为artifact的参数。能作为artifact参数的如下:
The following types/formats are supported:
    - Instances of MavenArtifact.
    - Instances of AbstractArchiveTask, for example jar.
    - Instances of PublishArtifact
    - Instances of Provider
    - Maps containing a 'source' entry, for example [source: '/path/to/file', extension: 'zip'].
    - Anything that can be converted to a file, as per Project.file()

添加dependsOn: 'build'的作用是:每次执行publish操作的时候,优先执行build构建。这样能保证publish之前,jar/aar都是最新的.

之后就是repositories。如上面格式所写即可.


2.1 java module发布到本地仓库

apply plugin: 'maven-publish'
task androidSourcesJar(type: Jar) {
    archiveClassifier.set('sources')
    String path=project.sourceSets.main.java.srcDirs     //区别1
    System.out.println("path: "+path)
    from project.sourceSets.main.java.srcDirs
}

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                groupId = 'com.github.bumptech.glide'
                artifactId = 'avif-annotation'
                version = '4.13.0'
//                archives project.tasks.bundleDebugAar
                artifact androidSourcesJar
                artifact("$buildDir/libs/${project.getName()}.jar")   //区别2 直接将jar塞进仓库
                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 {
                url = "file://d:/mavenrepository"  //本地仓库
            }
        }
    }
}

2.3 gradle 插件通过maven-publish

apply plugin: 'maven-publish'
//将插件打包上传到本地maven仓库
afterEvaluate {
    publishing {
        publications {
            test(MavenPublication) {
                groupId 'com.example.plugin'
                artifactId 'myGradlePlugin'
                version '1.0.0'
                //from components.java
            }
        }
        repositories {
            maven {
                url = "../repo"  //本地仓库
            }
        }
    }
}

注意得提前build下

以上就是打包发布的模板代码。供以后学习参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容