一、相关专业术语说明
- Maven:全名Apache Maven,是Apache开发的一个软件项目管理和项目自动构建工具
- Maven仓库:存放Maven库资源的地方,可以是远程Maven服务器,也可以是本地Maven服
- POM:Project Object Model,一个用来描述项目信息的xml文件,以xml节点的形式记录项目所属分组,项目名称,项目版本,依赖类库等信息
- JCenter:一个由 bintray.com维护的Maven仓库。Bintray其实只是一个网站,他们负责维护JCenter这个库,就是说JCenter库是托管在Bintray网站上的。
- Maven Central:一个由sonatype.org维护的Maven仓库。
- JitPack:JitPack是一个与GitHub绑定,提供代码仓库服务的平台,用于将GitHub项目发布到JitPack仓库,JitPack登录使用的也是GitHub帐号。JitPack的定位是私人仓库,而不是公共仓库,因此没有审核,GitHub项目只要能够成功编译,即可发布,熟练者发布一个新版本只需要1-2分钟
二、JCenter、MavenCenter、JitPack的区别与联系
这3个名词即具体的Maven仓库的地址,他们都是Maven仓库,但是属于不同的服务源。总的来说,只有两个标准的Android library文件服务器:Jcenter 和 Maven Central,现在JitPack也流行了起来。(比较方便)
从哪引用这几个Maven仓库呢,就是在根目录build.gradle中
allprojects {
repositories {
jcenter() //JCenter仓库
mavenCenter() //mvenCenter仓库
maven { url "https://jitpack.io" } // jitpack仓库
}
}
我们发现第三个jitpack的写法和前2个不一样,写法是maven {} 里面加入地址,其实这个才是maven仓库标准引用方法,jcenter和mavenCenter由于是标准的Android仓库,相当于定义了一个别名。所以一些自定义的仓库都是这种写法然后填入自己的仓库网址,比如Fabric.io的library,maven { url 'https://maven.fabric.io/public' }
具体使用哪个要看开源项目把Library传到了哪个仓库。它就会要求你在这加哪个仓库。
JCenter和Maven Central是最标准权威的两大Maven仓库,主流的类库在它们上面基本都能找到。JCenter发布项目时,提供了同步发布到Maven Central的选项。Maven Central配置非常繁琐,JCenter配置起来简单得多,但是JCenter在国内不好用,时常会遇到无法注册的问题,比如不支持国内邮箱,注册时无响应等问题。虽然jcenter和Maven Central 都是标准的 android library仓库,但是它们维护在完全不同的服务器上,由不同的人提供内容,两者之间毫无关系。在jcenter上有的可能 Maven Central 上没有,反之亦然。
起初,Android Studio 选择Maven Central作为默认仓库。如果你使用老版本的Android Studio创建一个新项目,mavenCentral()会自动的定义在build.gradle中。但是Maven Central的最大问题是对开发者不够友好,上传library异常困难,上传上去的开发者都是某种程度的极客,同时还因为诸如安全方面的其他原因,Android Studio团队决定把默认的仓库替换成jcenter。正如你看到的,一旦使用最新版本的Android Studio创建一个项目,jcenter()自动被定义,而不是mavenCentral()。
不过现在jcenter服务停止,需要迁移项目库(比如mavenCentral),这意味着几乎所有使用了jcenter的项目将要面临失败构建(包含Android开发中build.gradle 和其它开源的二进制依赖)Google在3月1日已经警告开发者移除Jcenter(),并且针对Google自己的开源库,在Android Studio 4.2 Google已经把Maven Central 作为gradle的默认配置了(以前是jcenter),kotlin的所有库也立马转移到maven central。
所以现在只推荐jitpack,Maven Central或者自建Nexus。一般个人或组织:推荐jitpack;如果是大一点的公司就可以自建Nexus或maven central
三、使用Jitpack发布
个人最后实际上使用的是这个最简单的发布仓库,下面写下操作的步骤
1. AS创建Project和要分享上传的Module
2. 配置Gradle
项目的根目录build.gradle中添加
buildscript { dependencies { classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
在想要做成库的module的build.gradle中添加
apply plugin: 'com.github.dcendents.android-maven' group='com.github.YourUsername'
把YourUsername改成你自己github的用户名即可
3. 本地检查测试
jitpack不同于其他库,并不是上传aar文件或者jar文件,而且直接从你的github拉取代码在线编译。为了避免我们不断的在线编译错误,我们可以在根目录下执行指令:
gradlew install
如果显示BUILD SUCCESSFUL,那就恭喜你成功了。上传代码吧。
4. 上传发布版本
a. 在github中打开你项目的首页,根据如下路径(见下图):
releases -> Draft a new release
发布一个新版本或者现在本地创建TAG,然后上传,命令如下:
git tag <tagname> //用于新建一个标签
git push origin --tags //可以推送全部未推送过的本地标签;
b. 打开jitpack的网站(https://jitpack.io/),用你的github账号登录,你就会看到左边的列表中,有你github上的所有项目,选择你要发布的项目,选择版本,点击发布。等到log对应的图标变绿,那就成功啦。 如果log的图标是红的,那就点进去看下log,根据错误修改下代码吧。如果你用gradlew install命令检查过还报错的话,那就是github中的文件不全,比如漏了上传gradlew文件
点击Draft a new release如下:
Jitpack上传并编译成功后的样子:
这是在线编译的Log日志:
5.自测使用发布的库
a. 在你想要使用的项目的根目录build.gradle中添加
b. 添加依赖allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
dependencies { implementation 'com.github.xuetaotao:imagepicker:1.0.2' //RxJava2 implementation 'io.reactivex.rxjava2:rxjava:2.2.21' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' //RxPermissions https://github.com/tbruyelle/RxPermissions implementation 'com.github.tbruyelle:rxpermissions:0.10.2' }
c. 使用
fun imagePickerTest(view: View) { ImagePicker.with(this) .imagePickerListener(object : ImagePicker.ImagePickerListener { override fun onFailed(msg: String, code: String) { Toast.makeText(this@MainActivity, msg + code, Toast.LENGTH_SHORT).show() } override fun onSuccess(imagePath: String) { val bitmap = BitmapFactory.decodeFile(imagePath) iv_image.setImageBitmap(bitmap) } }) .compress(true) .crop(false) .isCamera(false) .startPick() }
官方网站的How to
备注:Gradle刷新缓存方法
注意 Gradle 会缓存SNAPSHOT内容,所以有时候你可能无法获取某个分支上的最新 build。Gradle 自身也提供的方法来控制这一点。你可以在 build.gradle 中要求 Gradle 总是拉取最新的 build 版本:
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'//0秒刷新
}configurations.all {
resolutionStrategy { cacheChangingModulesFor 1, 'minutes' //1分钟刷新
force 'com.squareup.okhttp3:okhttp:3.12.0' //强制使用某个库的某个版本}
}
你也可以通过命令行添加 --refresh-dependencies 来要求一次 gradle build 中额外地废除 cache 内容并从远程拉取最新的 build 版本。
四、使用Maven Central发布
自己搞了一半,配置太难了放弃了,以后有时间再研究吧。附上大佬的文章
Mavencentral发布指南--再不行动起来,你的托管的library就没了
发布android库AAR至mavenCentral看这篇文章就可以了
五、自建Nexus
没有研究太细,就贴一下大佬的文章吧