阅读量:0
maven插件与maven-publish插件的区别
maven插件适用于gradle1.0-6.2版本,6.2版本后该插件就被废弃了,推荐使用maven-publish插件。
maven-publis插件是在gradle 1.3 版本后开始支持的,使配置更加简洁。
maven-publis插件的使用
应用插件
apply plugin: "maven-publish"
基础配置
配置发布的代码,基础配置信息:
publishing { // 配置maven 仓库 repositories { RepositoryHandler handler-> handler.mavenLocal() // 发布到默认的本地maven仓库(USER_HOME/.m2/repository/) } // 配置发布产物 publications {PublicationContainer publication-> // 任务名称:maven (名称可以随便定义) maven(MavenPublication) {// 容器可配置的信息(不能少) MavenPublication // 依赖 bundleReleaseAar 任务,并上传其产出的aar afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } // 方式一:生成aar包 // artifact "$buildDir/outputs/aar/${project.name}-release.aar" // 方式二:指定生成的aar路径 groupId = "com.hww.rumeng" artifactId = "testJ" version = "1.0.2-SNAPSHOT" } } }
publish
publishing
是一个用于配置项目发布(Publishing)相关信息的部分,可以配置的信息有两个:repositories
publications
publish.repositories
- repositories 用于配置maven仓库地址。
repositories { RepositoryHandler handler -> handler.mavenLocal()//默认本地maven仓库地址 handler.maven { url "${rootDir}/repo" //指定本地maven仓库地址 } // 仓库用户名密码 // handler.maven { MavenArtifactRepository mavenArtifactRepository -> // // maven 仓库地址 // url 'http://10.0.0.10:8082/repository/core/' // // 访问仓库的 账号和密码 // credentials { // username = "testUser" // password = "123456" // } // } }
publish.publications
- publications 配置需要发布的jar的信息,即aar包的信息。 publications 是一个容器,类型是 PublicationContainer ,其可以配置的信息类型是 MavenPublication。即 可以理解成 publications 是一个列表集合,而集合中存储的对象是 MavenPublication,而对象的名称可以由自己随便定义。 所以 publications 也是可以配置多个的,如:
publications { PublicationContainer publicationContainer -> // 发布 snapshot 包 debug(MavenPublication) { afterEvaluate { artifact(tasks.getByName("bundleDebugAar")) } groupId = "com.hww.rumeng" artifactId = "testJ" version = "1.0.2-SNAPSHOT" } // 发布正式包 release(MavenPublication) { afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } groupId = "com.hww.rumeng" artifactId = "testJ" version = "1.0.2-SNAPSHOT" } }
上传指定aar包的方式:
- 通过依赖生成aar包任务,如:
afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
- 通过指定生成的aar路径,如:
artifact "$buildDir/outputs/aar/${project.name}-release.aar"
上传源码
在maven-publish插件的基础使用中是不包含上传aar包的源码。
增加上传源码的task,如:
// 增加上传源码的task task sourceJar(type: Jar) { from android.sourceSets.main.java.srcDirs archiveClassifier = "sources" } publishing { repositories { RepositoryHandler handler -> handler.mavenLocal() } publications { PublicationContainer publicationContainer -> maven(MavenPublication) { artifact sourceJar // 增加上传源码的 task afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } groupId = "com.hww.rumeng" artifactId = "testJ" version = "1.0.2-SNAPSHOT" } } }
增加上面的task后,源码能上传,注释也是能看到的。
依赖传递
经过基础与上传源码后,是能正常依赖与使用的,但是aar包原本依赖的一下第三方包是不会自动依赖,需要手动添加依赖。
把library中的依赖信息,手动添加到 pom 文件中,就可以完成依赖传递,如下:
maven(MavenPublication) { // 依赖 bundleReleaseAar 任务,并上传其产出的aar afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } artifact sourceJar groupId = "com.hww.rumeng" artifactId = "testJ" version = "1.0.2-SNAPSHOT" // pom文件中声明依赖,从而传递到使用方 pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') configurations.implementation.allDependencies.each { // 避免出现空节点或 artifactId=unspecified 的节点 if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) { println "dependency=${it.toString()}" def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) dependencyNode.appendNode('scope', 'implementation') } } } }
上传kotlin项目的aar包,源码上传问题
通过 android.sourceSets.main.java.srcDirs 指定的源码,只能识别到 Java 文件,而 kt 文件被忽略了,但 通过查看官方文档可以知道,from 函数是可以指定源码路径的,所以这里直接把 from 函数的参数替换为 源码路径,如以下代码
task sourceJar(type: Jar) { from android.sourceSets.main.java.getSrcDirs() // 源码路径 archiveClassifier = "sources" }
如此修改后,发布的aar包也是能正常访问源码的