gradle打包问题总结

拓拔浩阔
2023-12-01

1.解析pom文件,添加到指定pom中


apply plugin: 'maven'
apply plugin: 'maven-publish'

task sourcesJar(type: Jar) {
    classifier 'sources'
    from 'src/main/java'
}

def libDIr = "${rootProject.getRootDir()}/repo/com/xx/xx/core/0.3.0"

def getPropertyFromLocalProperties(key) {
    File file = project.rootProject.file('local.properties');
    //兼容WmPlugin的发布
    if(!file.exists()){
        file = project.rootProject.file('../local.properties');
    }
    if (file.exists()) {
        Properties properties = new Properties()
        properties.load(file.newDataInputStream())
        return properties.getProperty(key)
    }
}

def parseXml() {

}

afterEvaluate { project ->
    publishing {
        publications {
            debug(MavenPublication) {
                groupId = 'com.xx.xx'//公司域名
                artifactId = 'core'//该aar包的名称
                version = "0.1.0" //版本号

                artifact "${libDIr}/core-0.3.0.aar"


                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')

                    println "withXml path =  $libDIr"

                    def xmlSlurper = new XmlSlurper()
                    def pomTxt = xmlSlurper.parse("${libDIr}/core-0.3.0.pom")

                    println "pomTxt dependency size =  ${pomTxt.children().size()}"

                    pomTxt."dependencies".children().each { dependency ->

                        println "dependency: ${dependency.groupId} ${dependency.artifactId} ${dependency.version}"

                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dependency.groupId)
                        dependencyNode.appendNode('artifactId', dependency.artifactId)
                        dependencyNode.appendNode('version', dependency.version)

                        println "dependencyNode: ${dependencyNode}"
                    }
                }
            }
        }

        repositories {
            def user = getPropertyFromLocalProperties("username")
            def pwd = getPropertyFromLocalProperties("password")
            def repoUrl = getPropertyFromLocalProperties("repo_url")
            def repoName = getPropertyFromLocalProperties("repo_name")

            maven {
                name = repoName
                url = repoUrl
                credentials {
                    username user
                    password pwd
                }
            }
        }
    }
}

2.子module依赖aar,父module直接调用子aar类的问题

有如下依赖关系:AModule -> BModule(包含xx.aar),
A的build.gradle

    api project(path: ':BModule')

B的build.gradle(写法一):

    
android {
    repositories {
        flatDir {
            dirs 'libs','provideLibs' //this way we can find the .aar file in libs folder
        }
    }
}

dependencies {
  api(name: 'base-1.0.9', ext: 'aar')
}

B的build.gradle(写法二):

dependencies {
  //lib目录下都是必须的
  api fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
  api fileTree(include: ['*.jar', '*.aar'], dir: 'provideLibs')
}

经过实验发现,只有写法二,AModule才可以引用到BModule中的aar的类,但是在写法一的基础上在AModule中也配置flatDir {dirs} 参数,这个参数对应着BModule的lib路径,这样AModule也可以引用到了。

原因猜测是,第二种写法,在依赖项目配置完成后,api方法会自动将依赖的aar转化成可以引用到的绝对路径,这样sdk引用了BModule之后,可以通过绝对路径找到aar。
但是第一种方式,只相对于BModule自己设置了相对路径,flatDir {dirs}配置也只是BModule可见,AModule只通过相对路径是找不到aar的。

也可以在根build.gradle中,配置configuration.all参数配置所有的lib的路径集合,这样所有module都可以找到了。

3.fataar的使用

子module打包成aar的时候,然后将aar上传到maven仓库。
但是子module打包成aar只会包含jar,源码,pom文件,jat会和源码进行合并,但是子module中依赖的aar是不会合并到源码中的,所有这种情况处理方式有两种。

1.使用fataar工具,将所有的依赖aar和子module的源码进行合并打包操作。
2.使用maven插件,将aar上传到maven服务器,然后子module进行pom依赖。
fataar地址:https://github.com/kezong/fat-aar-android

 类似资料: