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
}
}
}
}
}
有如下依赖关系: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都可以找到了。
子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