Android studio 发布公共类库到服务器maven仓库

[TOC]

准备

安装准备蛮多的,例如java环境什么的这里不多说,达到目标就行

  • 客户端准备
    Android studio 1.3以上 本文使用 1.5.1
    Gradle 2.4 以上,本文使用 2.9

  • 服务端准备

Git服务器,这里准备的是 Gitlab 内网服务器,用公共服务器也行
Maven服务器,本文准备的是 Nexus 服务器
Android SDK Linux版本
Gradle 2.4以上,本文使用2.9

Nexus安装

去官网下载安装包后,复制到 ~/opt 目录,执行如下命令

sudo cp nexus-x.xx.x-xx-bundle.tar.gz /usr/local
cd /usr/local
sudo tar xvzf nexus-x.xx.x-xx-bundle.tar.gz
sudo ln -s nexus-x.xx.x-xx nexus

nexus oss官方建议将nexus-x.xx.x-xx安装到/usr/local目录下,并做个/usr/local/nexus链接指向nexus-x.xx.x-xx目录,方便以后nexus oss版本升级

方便以后使用

  • $NEXUS_HOME环境变量指向/usr/local/nexus
  • 将sonatype-work迁移到其它指定路径,可以修改nexus-x.xx.x-xx/conf/nexus.properties配置文件中的nexus-work变量值

运行 Nexus

nexus-x.xx.x-xx/bin/nexus start

配置服务端

配置帐号

git用户租,Nexus用户组
git帐户,Nexus帐户

配置sonatype nexus oss

浏览器打开http://服务器地址:8081/nexus就可以看到nexus oss的控制面板

新建仓库 android-releaseandroid-snapshots
建立调度权限 android 添加 新仓库的推送于管理权限
把用户加入到调度权限中

详细操作请查看 Nexus权限管理于调度任务

这个时候,就有了可用的Android 仓库了

发布公共类库到服务器Android仓库

创建插件脚本 nexus-pulish.gradle

apply plugin: 'maven'
apply plugin: 'signing'

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

def getReleaseRepositoryUrl() {
  return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL : "http://xxxx:9009/nexus/content/repositories/android-releases/"
}

def getSnapshotRepositoryUrl() {
  return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL : "http://xxxx:9009/nexus/content/repositories/android-snapshots/"
}

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

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

afterEvaluate { project ->
  uploadArchives {
    repositories {
      mavenDeployer {
        pom.groupId = GROUP
        pom.artifactId = POM_ARTIFACT_ID
        pom.version = VERSION_NAME
        repository(url: getReleaseRepositoryUrl()) {
          authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
        }
        snapshotRepository(url: getSnapshotRepositoryUrl()) {
          authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
        }
      }
    }
  }
  task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    options {
      encoding "UTF-8"
      links "http://docs.oracle.com/javase/7/docs/api/"
      linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
    }
    exclude '**/BuildConfig.java'
    exclude '**/R.java'
  }
  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
    "${project.buildDir}/outputs/aar/${project.name}-release.aar"
  }
}

请修改其中的 getReleaseRepositoryUrl()getSnapshotRepositoryUrl() 指向你配置的 仓库地址

将脚本推送到公共git仓库,获取这个脚本的 raw 地址 http://......../master/.../nexus-pulish.gradle

module 设置

检查构建配置

build.gradle 设置为

apply plugin: 'com.android.library'

全局工程的 local.properties配置项指定的 sdk.dir ndk.dir 是否正确

检查依赖库

如果有动态库 so,且不是生成的,必须将文件放到 {$module}/src/main/jniLibs

配置推送参数

使用时在需要推送的module的 build.gradle 最后增加

apply from [raw 地址]

并在对应 module 中修改或者创建文件 gradle.properties,内容如下

# if GROUP chants SNAPSHOT this project will archive to snapshots which archive to releases not chants
GROUP=SNAPSHOT
# VERSION Name of this must be x.x.x
VERSION_NAME=0.0.1
# maven artifactID
POM_ARTIFACT_ID=com.package.name

# snapshot url
#SNAPSHOT_REPOSITORY_URL=

# release url
#RELEASE_REPOSITORY_URL=

# username
NEXUS_USERNAME=

# password
NEXUS_PASSWORD=

请填充配置
GROUP
VERSION_NAME
POM_ARTIFACT_ID
NEXUS_USERNAME
NEXUS_PASSWORD

GROUP建议包名
VERSION_NAME 三段数字字母小写POM_ARTIFACT_ID 库的别名

使用Gradle推送

运行

gradlew uploadArchives
# 只发布这个module
gradlew :moudleName:uploadArchives

或者在Android studio 的右侧 Gradle 菜单里,找对应的项目的taskuploadArchives
运行这个 uploadArchives任务

推送成功后,日志会显示成功

使用私有仓库

在需要使用的module的 build.gradle 中加入

dependencies {
 repositories {
 jcenter()
 maven{
 url 'http://...../your-release'
 }
 }
 compile 'GROUP:POM_ARTIFACT_ID:VERSION_NAME'
 //例如使用公告库,私有库请查阅库本身参数
 compile 'com.android.support:appcompat-v7:23.2.1'
}

这个格式来使用这个私有公共库

gradle.properties 配置详解

发布配置

字段 用途 备注
GROUP 发布组ID 一般写主要包结构 com.package.name
VERSION_NAME 版本号 一般填写0.0.1,用于区分版本
POM_ARTIFACT_ID 标识ID 一般用工具名称name
NEXUS_USERNAME 用户名 Nexus管理员分配
NEXUS_PASSWORD 密码 登陆后可自行修改
SNAPSHOT_REPOSITORY_URL 快照仓库配置 一般注释不填写
RELEASE_REPOSITORY_URL 发布仓库配置 一般注释不填写

快照发布

GROUP=SNAPSHOT

正式发布

GROUP=包结构

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 对于1932年的哈尔滨来说,8月份这页历史,见不到夏日的明丽和甘爽。如同泡在水里的一块木板,潮乎乎湿渌渌的,透出丝...
    马风阅读 1,056评论 2 26
  • 幸福路人春风20171115第164天 今天晚上读父母规,女儿说停停停,然后指着第一条说,你不是说要多鼓励赞美孩子...
    春风7861阅读 266评论 0 0
  • 就像我平时看着你一样,此刻我知道你也在看着我,有趣时常就发生在我们身旁。--詹汉城 伴随着天昏地暗的天气,风呼呼地...
    苏宇城阅读 321评论 3 3