- 发布项目至JCenter(Bintray)报错或版本更新失败等问题请前往发布项目到Maven(JCenter)遇到的错误解决办法
写在前面:
之前在写项目时,喜欢将重复的功能或者自定义控件封装到公用的模块中,方便其他项目共用。当项目越来越多,很多项目都依赖了这个公用模块时,其中某一个项目中对公用模块中的代码进行了修改,此时其他依赖该公共模块的项目不得不做出修改或者同步代码,是不是相当麻烦?因此就不得不将公用模块打包成.aar文件(不清楚.aar文件的童鞋请自行Google或Baidu),公开或放在私服提供给各个项目使用。这里我们就随着前辈们的脚步来学习如何将项目模块发布至Maven仓库。真正做到只需一处修改,四处升级即可。本文将介绍发布到Maven的三种方式。最终将项目发布远程Maven仓库后添加至JCenter,供其他人使用你的公共库。
1:Maven的定义:
简单来说,Maven是项目(Software Project)管理工具。对于maven来说,一个软件工程的唯一标识是由开发者(groupId)、生成物(artifactId)、版本(version) 共同决定的。每个工程都有一个打包类型,可以是jar, aar,war, ear 或 pom,打包类型决定了工程最终产物的类型,其中pom类型用于构件多模块工程。其内部工作机制是通过解析pom.xml文件中的配置获取jar包或aar资源地址自动将资源download到Peoject中,省去了手动下载到本地的繁琐过程。
2:Maven的存储位置:
远程Maven仓库是存储服务器的物理空间上,本文介绍是将Maven发布到第三方OSS服务商Bintray的存储空间上。
发布代码到Maven的三种方式
一:发布到本地Maven
1:uploadArchives配置和Task生成
在要发布的模块build.gradle中配置uploadArchives属性,示例代码:
//添加这一行,告诉gradle应用到项目中
apply plugin: 'maven'
//配置模块未本地Maven仓库
uploadArchives{
repositories.mavenDeployer{
// 配置本地仓库路径,这里是项目的根目录下的maven目录中
repository(url: uri('../maven'))
// 唯一标识 一般为模块包名 也可其他
pom.groupId = "com.android.imusic.player.lib"
// 项目名称(一般为模块名称 也可其他
pom.artifactId = "music-player-lib"
// 发布的版本号
pom.version = "1.0.0"
}
}
配置后Sync Now一把,Studio编辑器右上角Gradle中你要发布的模块下会多出一个upload目录,目录中有个uploadArchives任务脚本,这个脚本就是将库发布到本地或私服Maven仓库的Task。
2:执行uploadArchives任务
点击如图所示的uploadArchives
uploadArchives有两种运行方法:1:双击运行。2:在AndroidStudio自带的Terminal中执行 gradlew uploadArchives 命令运行。根据喜好选取一种即可,开始任务后等待编译完成。
编译完成后在你项目的根目录会生成一个maven目录,在目录maven->com.android.imusic.ib->music-player-lib->1.0.0中会有个music-player-lib.aar 文件,这个文件就是打包签名好的库文件。
3:应用music-player-lib.aar库文件到项目中
- 3.1:项目根目录build.gradle配置Maven
在你的项目中根目录下的build.gradle中配置如下代码:
allprojects {
repositories {
google()
jcenter()
//本地Maven仓库地址,取决于你的磁盘目录
maven {
url 'file://D://AndroidStudioProjects//IMusic//maven'
}
}
}
- 3.2:app中的build.gradle配置
在你想要依赖.aar的模块中的build.gradle中配置如下代码:
//应用这个依赖,这里填写刚才配置的包名+库名
implementation 'com.android.imusic.lib:music-player-lib:1.0.0'
- 或者你可以不配置本地仓库,直接将.aar文件复制到你的app模块中直接使用,配置代码如下:
//在你的app中的build.gradle中配置
android {
repositories {
flatDir {
dirs 'libs'
}
}
}
//添加依赖
implementation(name: 'music-player-lib-1.0.0', ext: 'aar')
点击Sync Now等待完成后发布依赖到本地Maven就成功啦!在发布到本地Maven前你应该要校验混淆开启的情况噢~免得他人依赖你的项目时掉坑里去了。发布到本地Maven固然方便,但是公司项目团队人数较多时,将模块打包成.aar文件后复制到项目多少有点不方便,比如所A程序员的本地Maven路径是在D盘,而B程序员的Maven路径又在E盘,这样同步代码改来改去着实难受,所以接下来就介绍适应公司内部团队多人开发的场景,即将代码发布至局域网仓库。
二:发布到局域网Maven
局域网部署需要用到私服部署,这里跟随前辈脚步介绍使用Nexus来搭建部署局域网Maven仓库。
1:安装部署Nexus(这里用nexus-2.14.2-01版本演示)
点此前往下载nexus-2.14.2-01
下载解压后会看到目录下下面几个文件夹
目录下批处理脚本释义:
console-nexus.bat--->常规安装Nexus服务
install-nexus--->启动开机自启动Nexus服务
start-nexus.bat--->启动Nexus服务
stop-nexus.bat--->停止Nexus服务
uninstall-nexus.bat--->卸载Nexus组件
wrapper.exe--->桌面程序
- 鼠标右键"console-nexus.bat"以管理员身份运行,等待CMD创建安装完成后在浏览器输入:http://localhost:8081/nexus。
安装和成功启动后是这样的
2:Nexus仓库配置
-
2.1:点击右上角Log In,登录默认账号,默认账号:admin 密码:admin123
-
2.2:修改默认密码
按照步骤修改密码即可,如果需要修改默认的端口号,修根目录下的conf-nexus.properties文件中的application-port=8081一栏,将8081替换你指定的端口号:、
配置就绪后,准备发布,发布后你的项目路径如图所示:
3:准备发布
- 3.1:模块的build.gradle配置
apply plugin: 'com.android.library'
//应用到Maven
apply plugin: 'maven'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
//打包main目录下代码和资源的 task
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
//配置需要上传到maven仓库的文件
artifacts {
archives androidSourcesJar
}
//上传到Maven仓库的task
uploadArchives {
repositories {
mavenDeployer {
//指定maven的仓库url,IP+端口+目录
repository(url: "http://localhost:8081/nexus/content/repositories/releases/") {
//填写你的Nexus的账号密码
authentication(userName: "admin", password: "123456")
}
// 唯一标识 一般为模块包名 也可其他
pom.groupId = "com.android.imusic.lib"
// 项目名称(一般为模块名称 也可其他
pom.artifactId = "music-player-lib"
// 发布的版本号
pom.version = "1.0.0"
}
}
}
- 3.2:执行uploadArchives,将项目发布到Nexus
执行uploadArchives或者使用Studio自带的Terminal中执行 gradlew uploadArchives 命令开始构建运行。等待结束后,浏览器打开Nexus,查看Repositories->Releases 目录。成功发布后的代码库模块目录如图所示:
4:使用局域网Nexus存储库代码库
- 4.1:根build.gradle配置修改
在你的项目中的根build.gradle中添加如下代码
allprojects {
repositories {
google()
jcenter()
//本地Maven仓库地址,取决于你的磁盘目录
maven {
//这里本地不再使用,改用下面的局域网的路径
//url 'file://D://AndroidStudioProjects//IMusic//maven',
//添加本地仓库URL
url 'http://localhost:8081/nexus/content/repositories/releases/'
}
}
}
- 4.2:app模块中build.gradle配置修改
在你的项目中要使用代码库的模块中的build.gradle做如下修改:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//和刚才使用本地Maven仓库一致:包名+库名
implementation 'com.android.imusic.lib:music-player-lib:1.0.0'
到此,发布代码到本地仓库到此结束了。但是随之又来了一个问题,局域网仓库对公司团队来说固然是好,但是你开发的模块很牛逼的时候,别人要用你的模块时怎么办?这个时候就需要将模块发布至外网仓库,即发布代码至JCenter。
三:发布到外网Maven
发布到外网Maven,本问介绍发布到JCenter上。在早期的AndroidStudio版本中,Google默认使用的仓库是mavenCentral,但由于发布流程太复杂(前辈们是这样分析的,不知道对不对),后来改用默认仓库是JCenter,说了这么久还没介绍JCenter是什么?简单来说JCenter是Bintray其下的一个分区仓库,代码托管的存储空间。那既然JCenter是属于Bintray旗下的,那就首先得从Bintray开始。
1:Bintray账号准备
Bintray是一家OSS服务商,类似国内的阿里云OSS。要将代码发布之JCenter,必须先有Bintray账号和分区目录。感兴趣可以去看下AndroidStudio的Bintray库在Giuhub中的项目:Bintray-Github。注册账号我们注册个人账号即可。前往Bintray官网个人账号注册。
-
注意:1.注册账号最好注册个人的,不然企业账号没有add To Jcenter功能,需要收费。2:注册的邮箱一定要使用国外的邮箱,不然注册没反应。
2:为Bintray账号添加组织
添加组织有两种方式:1:创建Bintray组织。2:导入第三方托管平台组织。
2.1:创建Bintray组织
在bintray主页鼠标放至头像弹窗的Menu框中点击createOrganization->界面跳转后点击->Create new organization创建新的组织。
按照提示填写组织基本信息提交即可。
2.2:导入第三方平台组织
Bintray支持第三方托管平台的组织导入,但目前为止只支持从Github导入组织到Bintray。
-
2.2.1:导入Github组织
在bintray主页鼠标放至头像弹窗的Menu框中点击createOrganization->再点击Import from GitHub导入Github账号组织。第一次导入官方会给出操作流程图,如下:
-
2.2.1.1 前往Github设置中心
点击图中标记的Account Setting page,前往Github设置中心界面。跳转至Github的设置中心后依次点击左侧的Applications,展开界面后点击右侧的Authorized OAuth Apps,展开列表就可看到支持列表中有bintray了。
-
2.2.1.2 授权Bintray访问Github账户的权限
点击Bintray一栏中的Grant,授予Bintray访问Github账户的权限。
- 2.2.2:填写第三方组织在Bintray中的基本信息
授予访问权限后,再次走导入Github组织流程,选择你的组织后,根据界面提示填写基本信息提交即可。
3:创建Bintray存储分区
点击Add New Repository创建存储分区
按图中所示,填写分区基本信息
创建成功后是这样的
4:模块build.gradle配置
4.1:在你项目的根build.gradle中配置bintray环境依赖
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//添加bintray环境
classpath 'com.novoda:bintray-release:0.8.1'
}
}
4.2:在你要发布的模块build.gradle中配置如下配置
apply plugin: 'com.novoda.bintray-release'
//推送到Bintray配置
publish {
//你的账户bintray下某个组织id
userOrg = 'xxxxxx'
//Maven仓库下库的包名,一本与包名相同
groupId = 'xxx.xxx.xxx'
//项目名称
artifactId = 'xxx'
//版本号
publishVersion = '1.0.0'
//项目介绍,可以不写
desc = 'xxx'
//项目主页,可以不写
website = 'xxx'
}
最终的依赖地址是compile '仓库包名:项目名称:版本号'
5:编译并发布到Bintray
5.1:获取Bintray API Key
在你的Bintray主页点击右上角头像 右上角用户名–>Edit Your Profile -> API Key –>输入密码–>Submit–>Show。复制API key备用。
5.2:运行发布命令
在AndroidStudio编译器自带的Terminal中输入命令:
gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
//BINTRAY_USERNAME替换为你的Bintray用户名,BINTRAY_KEY替换为你刚才获取的Bintray API KEY
//PdryRun释义:false:编译且将你的项目上传至Bintray ,true:只是构建你的项目,不会上传
如果你在编译中遇到问题,请前往AndroidStudio发布项目到Bintray遇到的错误及解决
开始构建后耐心等待,可能会因为socket出现多次上传失败,重试即可。直到出现这个表示上传成功。
上传完成后可在你的主页或者组织下查看
6:添加至JCenter
点击右下角add to JCenter,确认后点击send提交,等待审核通过。(白天提交会到晚上才审核通过,因为有时差,在他们上班时间提交,会立即审核通过)
send后,等待审核通过,通过后即可在外网使用你的库作为依赖了。
这个是Bintray回复的站内通知
7:项目引用JCenter库
7.1未添加至JCenter引用:
- 7.1.1:在根build.gradle中配置如下代码
allprojects {
repositories {
//bintray环境
maven { url 'https://dl.bintray.com/novoda-oss/snapshots/' }
//你的maven路径
maven { url 'https://dl.bintray.com/你的id/maven' }
}
}
- 7.1.2:在app模块中的build.gradle中配置如下代码
dependencies {
//添加你的项目依赖地址,如下规则
implementation '仓库包名:项目名称:版本号'
//例如我的:
//implementation 'com.imusic.player:music-player:1.0.0'
}
7.2:已添加至JCenter引用:
- 7.2.1:在根build.gradle中配置如下代码
allprojects {
repositories {
//bintray环境
maven { url 'https://dl.bintray.com/novoda-oss/snapshots/' }
//添加支持JCenter即可
jcenter()
}
}
- 7.2.2:在app模块中的build.gradle中配置如下代码
dependencies {
//添加你的项目依赖地址,如下规则
implementation '仓库包名:项目名称:版本号'
//例如我的:
//implementation 'com.imusic.player:music-player:1.0.0'
}