Android开发使用私有maven库
有时候需要使用自己开发的私有依赖库,打成AAR包依赖的方式,集成起来非常不方便,一旦库代码有更新,就需要重新导入AAR,过程过于繁复。这时候就可以考虑使用Maven仓库,maven可以是位于远端服务器、局域网服务器、本地主机上的仓库。
本地Maven私有仓库使用
首先是库工程进行配置,这里需要使用Gradle Android Maven plugin,这个插件专门用来编译Android Library,插件地址:https://github.com/dcendents/android-maven-gradle-plugin
引入方式,在库工程的Project build.gradle文件中buildscript下的dependencies下增加classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1':
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
在库工程module的build.gradle文件增加
apply plugin: 'com.github.dcendents.android-maven'
引用一个库类似这样:
implementation 'com.android.support:appcompat-v7:28.0.0'
Maven定位到库需要三个标识:
- groupId 唯一标识,一般是域名反转,eg:com.android.support
- artifactId 项目名称,eg:appcompat-v7
- version 版本号,eg:appcompat-v7
配置库标识
在module的build.gradle文件中,首先配置代表标识符的几个变量,方便引用:
def myGroup = "com.xxx"
def myArtifactId = "ArtifactidName"
def myVersion = "1.0.0-beta"
//描述名称
def proName = "Easy Clock"
//选配信息
//项目主页
def siteUrl = 'https://dl.bintray.com/GitHubName/' + myArtifactId
//项目的git地址
def gitUrl = 'https://github.com/GitHubName/' + myArtifactId + '.git'
配置打包用到的几个task:
//生成jar包的task
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
//生成Javadoc文档
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
//文档打包成jar
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
//拷贝javadoc文件
task copyDoc(type: Copy) {
from "${buildDir}/docs/"
into "docs"
}
//上传到JCenter所需要的源码文件
artifacts {
archives javadocJar
archives sourcesJar
}
配置该插件的install,生成pom.xml文件
// 配置maven库,生成POM.xml文件
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
//对应pom中<groupId>
group myGroup
//对应pom中<artifactId>
artifactId myArtifactId
//对应pom中<version>
version myVersion
//对应pom中<packaging>
packaging 'aar'
//对应pom中<name>项目描述,随意填
name proName
//对应pom中<url>
url siteUrl
licenses {
license {
//开源协议
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
//开发者的个人信息
id 'AABB'
name 'AAXX'
email 'XXX@gmail.com'
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
现在配置算是完成,接着可以使用gradle进行打包了:
//MAC下
$ gradle install
//Windows下
> ./gradlew install
完成打包后会在本地maven仓库下生成相应版本的文件:
//Mac下默认路径
/Users/用户名/.m2/repository/com/xxx/ArtifactidName/1.0.0-beta
如果遇到生成javadoc报错导致打包无法完成,module的build.gradle加上这段failOnError false 忽略掉:
javadoc {
options {
//如果你的项目里面有中文注释的话,必须将格式设置为UTF-8,不然会出现乱码
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
failOnError false
}
}
上传库到指定的服务器
服务器可以是局域网的服务器,也可以是公网服务器。替换插件配置com.github.dcendents.android-maven为maven:
//apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'maven'
替换install任务为uploadArchives:
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def mavenUserName = properties.getProperty("nexus.userName")
def mavenPassWord = properties.getProperty("nexus.passWord")
def nexusHost = properties.getProperty("nexus.host", "http://127.0.0.1:8081/")
def mavenCenterUrl=nexusHost + "repository/maven-releases/"
//上传到远程maven服务器
uploadArchives {
configuration = configurations.archives
repositories {
mavenDeployer {
snapshotRepository(url: nexusHost + "repository/maven-snapshots/") {
authentication(userName: mavenUserName, password: mavenPassWord)
}
repository(url: nexusHost + "repository/maven-releases/") {
authentication(userName: mavenUserName, password: mavenPassWord)
}
pom.groupId = myGroup
pom.artifactId = myArtifactId
pom.version = myVersion
pom.packaging = 'aar'
pom.project {
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
}
}
}
}
uploadArchives.mustRunAfter('build')
uploadArchives.doLast {
println "Uploaded Maven Server $mavenCenterUrl Success!!"
}
在local.properties中添加认证配置,当然前提是已经搭建一个nexus服务器:
nexus.userName=xxx
nexus.passWord=xxx
nexus.host=http://x.x.x.x:8081/
执行上传,到project根目录下执行:
Mac下
$ ./gradlew uploadArchives
Windows下
$ gradlew uploadArchives
其他工程依赖这个本地的私有库
首先需要增加依赖仓库的地址,在Project的build.gradle文件中的allprojects.repositories下增加maven { url LOCAL_REPO_URL },一般放到最后一个位置,查找依赖库时会从上到下依次查找:
allprojects {
repositories {
jcenter()
google()
maven { url LOCAL_REPO_URL }
}
}
其中LOCAL_REPO_URL是本地maven仓库的路径,建议将这个地址配置到gradle.properties或者local.proterties不需要添加到版本控制中的文件中,这里是放到gradle.properties中:
LOCAL_REPO_URL=file:///Users/用户名/.m2/repository
其他工程依赖指定私有库
增加仓库地址,同上:
同样在local.properties先增加nexus服务器认证配置:
nexus.passWord.readonly=xxx
nexus.userName.readonly=xxxx
在工程的build.gradle文件中增加:
buildscript {
...
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
ext.mavenUserNameReadOnly = properties.getProperty("nexus.userName.readonly")
ext.mavenPassWordReadOnly = properties.getProperty("nexus.passWord.readonly")
ext.nexusHost = properties.getProperty("nexus.host", "http://127.0.0.1:8081/")
...
}
...
repositories {
...
maven {
url("${nexusHost}repository/maven-releases/")
credentials {
username = "$mavenUserNameReadOnly"
password = "$mavenPassWordReadOnly"
}
}
}
在gradle的以来配置中,依赖本地私有库或者指定服务器私有库和依赖jcenter的远端仓库是一样的,都类似这样:
implementation 'com.xxx:ArtifactidName:1.0.0-beta'
这样就完成依赖了。
扫码领红包支持