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
类分拣器。属于Task中的一个变量。Task的类型是Jar。
archiveClassifier.set('sources2')
表示:给jar名称后面新增一个 "sources2"。影响到最终生成jar的名称。
- from path
from是Jar的一个方法,path是java代码的路径。表示:将path下面的java代码打包,生成以sources2结尾的jar包
-
test(MavenPublication)
语法意义:声明一个名为test的MavenPublication对象。名称可以随便取。这个名称主要影响的是gradle上的名字:
1111.png
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就是通过上面定义的名称。
- artifact
artifact属于 MavenPublication的方法。作用是将 "产物"放入到仓库。artifacts是一个集合,可以包含若干artifact
artifact 后面的参数能是一个Task,也可以是一个路径。但是并不是所有的Task都能作为artifact的参数。能作为artifact参数的如下:
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下
以上就是打包发布的模板代码。供以后学习参考
网友评论