美文网首页开发环境治理
Android开发使用私有maven库

Android开发使用私有maven库

作者: ByteCarry | 来源:发表于2019-03-01 12:36 被阅读0次

    有时候需要使用自己开发的私有依赖库,打成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'
    

    这样就完成依赖了。


    扫码领红包支持

    相关文章

      网友评论

        本文标题:Android开发使用私有maven库

        本文链接:https://www.haomeiwen.com/subject/saaruqtx.html