Android Gradle入门到精通(三)

2021-12-18  本文已影响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.set('sources2')

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

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

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就是通过上面定义的名称。


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下

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

上一篇 下一篇

猜你喜欢

热点阅读