在项目做到中后期的时候,基本会有多个甚至十几个模块构成。各个模块相对独立,但有些又相互依赖。
现阶段公司的各个模块有单独的仓库管理,通过导入其他模块的aar来实现依赖,这种方式简单快捷,但当一个仓库更新后,其他仓库就需要手动拷入改版本的aar,这样既不利于版本管理,又比较麻烦。
这时我们就需要通过maven来发布各自仓库的版本到Maven仓库中,然后每个仓库就可以通过maveb来引用所需要的依赖。

公司内部会自己搭建私有Maven仓库,就把包发布到私有Maven仓库当中。在当前module的gradle中进行maven发布的配置

uploadArchives {
    repositories {
        mavenDeployer {
            pom.project {
                groupId = "com.zsg.sample"
                artifactId = "smart"
                version = "1.0.0"
            }
            repository(url: "http://192.168.0.1:8800/test") {
                authentication(userName: "admin", password: "123")
            }

        }
    }
}




上面对maven进行简单的配置。通过执行gradle的task 来将该仓库上传到maven


在其他模块这样依赖: compile "com.zsg.sample:smart:1.0.0@aar"




[img]http://dl2.iteye.com/upload/attachment/0128/7051/9439e432-78cf-37ff-9bc4-ba0eef790ec9.jpeg[/img]



执行这个task时,会对项目进行编译,最后会将仓库中生成的aar和poms文件传到maven上去。aar这个大家都知道,这边我简单介绍下poms文件。


大家在build目录中可以看到poms文件夹,这里面有一个pom-default.xml文件,这个文件声明了仓库的名称、版本等重要的信息,这些信息都是我们在上面配置的。然后就是这个库所依赖的其他仓库的信息。这里要注意下,当我们依赖发布到maven上的这个库的时候,会同时依赖poms文件中所声明的其他库。




[img]http://dl2.iteye.com/upload/attachment/0128/7053/4a940a72-0160-32fd-ac45-7c09d108082e.jpeg[/img]



这里可以看到poms文件中声明了appcompat-v7这个 google库,如果发布时不想将这个库加入到依赖中 可以在gradle文件中将compile变为provided 这样打包的时候就把会将这个依赖放入poms文件中。


再下面我们可以发下我这模块又依赖了本地的panel-release模块 那么问题就来了,其他的模块依赖我这模块是 同时就要依赖panel-release模块 ,但panel-release模块又是我本地的,并没有传到maven上,所以就会导致依赖失败。这里有3个解决办法:


1、将panel-release的依赖变为provided 这样就不会放到poms里,但是这样可能会导致你编译过不了。


2、在动态生成poms文件时将panel-release依赖去掉


uploadArchives {
    repositories {
        mavenDeployer {
            conf2ScopeMappings.mappings.remove(configurations.compile)
            ......
        }
     }
}




3、在依赖时只依赖aar文件,不依赖aar包所依赖的其他库。


compile "com.zsg.sample:smart:1.0.0@aar"



强烈推荐第三种方法!!!!