美文网首页
Android Gradle入门到精通(三)

Android Gradle入门到精通(三)

作者: 过期的薯条 | 来源:发表于2021-12-18 13:01 被阅读0次

    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下

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

    相关文章

      网友评论

          本文标题:Android Gradle入门到精通(三)

          本文链接:https://www.haomeiwen.com/subject/qqkgfrtx.html