前言

在Android开发的世界中,依赖管理是每个开发人员不得不面对的问题,无论是外部的开源类库依赖,还是项目内部的模块间的依赖,都需要有效的管理。在Android中不仅可以依赖modulesojar还可以依赖aar。既可引用远程仓库jcenter()mavenCentral()、也可以引用私有仓库、本地仓库。使用Maven可以有效地解决依赖管理。

Maven包

  • 使用方式

    1
    2
    3
    dependencies {
    compile 'cn.sharesdk.onekeyshare:onekeyshare:1.0.0'
    }
  • 包结构

  • POM文件,包含maven包的相关信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.sharesdk.onekeyshare</groupId>
    <artifactId>onekeyshare</artifactId>
    <version>1.0.0</version>
    <packaging>aar</packaging>
    <name>Onekeyshare Aar Repository</name>
    <licenses>
    <license>
    <name>The Apache Software License, Version 2.0</name>
    <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    <distribution>repo</distribution>
    </license>
    </licenses>
    <developers>
    <developer>
    <id>troy</id>
    <name>troy</name>
    </developer>
    </developers>
    </project>

Maven 仓库

Maven仓库用于存放Maven包,可以是本地的,远程的、私有的、公开的。

1
2
3
4
5
6
repositories {
jcenter()
maven { url "https://jitpack.io" }
//私有maven仓库
maven { url "http://172.16.1.19:8081/repository/maven-releases/" }
}

使用Nexus搭建私有仓库

  • 下载nexus,选择nexus-3.0.1-01-mac.tgz

  • 解压文件,进入nexus-3.0.1-01/bin目录,输入./nexus start运行服务,nexus默认监听端口8081。

  • 浏览器中访问http://your ip:8081

  • nexus管理员主界面,默认帐号admin,密码admin123

  • 仓库类型
    hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
    proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
    group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。

发布包到私有仓库

  • 使用方法参考chrisbanes/gradle-mvn-push 插件

  • 在项目根目录新建gradle.properties文件

  • 使用如下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # 项目名称
    PROJ_NAME=onekeyshare
    PROJ_ARTIFACTID=onekeyshare
    PROJ_POM_NAME=Onekeyshare Aar Repository
    POM_PACKAGING=aar

    # the following can move to ~/.gradle/gradle.properties
    NEXUS_USERNAME=admin
    NEXUS_PASSWORD=admin123
    RELEASE_REPOSITORY_URL=http://172.16.1.19:8081/repository/maven-releases/
    SNAPSHOT_REPOSITORY_URL=http://172.16.1.19:8081/repository/maven-snapshots/

    # 包信息
    PROJ_GROUP=cn.sharesdk.onekeyshare
    PROJ_VERSION=1.0.0

    # 项目的描述
    #PROJ_WEBSITEURL=
    #PROJ_ISSUETRACKERURL=
    #PROJ_VCSURL=
    #PROJ_DESCRIPTION=Simple and effective bug & crash reporting tool for Android apps

    # Licence信息
    PROJ_LICENCE_NAME=The Apache Software License, Version 2.0
    PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
    PROJ_LICENCE_DEST=repo

    # Developer 信息
    DEVELOPER_ID=troy
    DEVELOPER_NAME=troy
    DEVELOPER_EMAIL=chenlongfeiceo@gmail.com
  • 根目录下新建gradle-mvn-push.gradle文件

  • 使用如下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    apply plugin: 'maven'
    apply plugin: 'signing'

    def isReleaseBuild() {
    return PROJ_VERSION.contains("SNAPSHOT") == false
    }

    def getReleaseRepositoryUrl() {
    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
    : "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
    }

    def getSnapshotRepositoryUrl() {
    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
    : "https://oss.sonatype.org/content/repositories/snapshots/"
    }

    def getRepositoryUsername() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME
    : ""
    }

    def getRepositoryPassword() {
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD
    : ""
    }

    afterEvaluate { project ->
    uploadArchives {
    repositories {
    mavenDeployer {
    beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

    pom.groupId = PROJ_GROUP
    pom.artifactId = PROJ_ARTIFACTID
    pom.version = PROJ_VERSION

    repository(url: getReleaseRepositoryUrl()) {
    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
    }
    snapshotRepository(url: getSnapshotRepositoryUrl()) {
    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
    }

    pom.project {
    name PROJ_POM_NAME
    packaging POM_PACKAGING
    // description PROJ_DESCRIPTION
    // url PROJ_WEBSITEURL

    scm {
    // url PROJ_VCSURL
    connection DEVELOPER_EMAIL
    developerConnection DEVELOPER_EMAIL
    }

    licenses {
    license {
    name PROJ_LICENCE_NAME
    url PROJ_LICENCE_URL
    distribution PROJ_LICENCE_DEST
    }
    }

    developers {
    developer {
    id DEVELOPER_ID
    name DEVELOPER_NAME
    }
    }
    }
    }
    }
    }

    signing {
    required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
    }

    task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    }

    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
    }

    task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.sourceFiles
    }

    artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
    }
    }
  • build.gradle中使用插件

    1
    apply from: '../gradle-mvn-push.gradle'
  • 执行gradle task进行上传操作

    1
    $ ./gradlew clean build uploadArchives

查看已上传的maven包

使用maven包

  • 声明私有仓库地址

    1
    maven { url "http://172.16.1.19:8081/repository/maven-releases/" }
  • 使用maven包

    1
    2
    3
     dependencies {
    compile 'cn.sharesdk.onekeyshare:onekeyshare:1.0.0'
    }