开发环境治理

Android开发使用私有maven库

2019-03-01  本文已影响0人  ByteCarry

有时候需要使用自己开发的私有依赖库,打成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定位到库需要三个标识:

配置库标识

在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'

这样就完成依赖了。


扫码领红包支持
上一篇下一篇

猜你喜欢

热点阅读