title: Android-发布项目到到 JCenter 仓库
date: 2018-02-01 17:03:01
tags:

写在前面

阅读这个博客,你会知道

  • Maven 的概念是什么?
  • 为什么要将代码上传到 Maven 仓库 ?
  • Maven 仓库的地址是从哪里来 ?
  • JCenter 和 Maven Central 是什么?
  • 如何将项目发布到 JCenter 仓库?

Maven 是什么?

Maven 官网 上的介绍:

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.

Maven 是一个软件项目管理工具和构建工具,基于 POM 的概念,Maven 可以参与项目的构建过程,还可以通过一些信息生成项目报告和文档。

总结来说,Maven 的功能可以分成三个方面:

  • 优秀的构建工具

    通过简单的命令,能够完成清理、编译、测试、打包、部署等一系列过程。同时,不得不提的是,Maven 是跨平台的,无论是在 Windows、还是在 Linux 或 Mac 上,都可以使用同样的命令。

  • 依赖管理工具

    项目依赖的第三方的开源类库,都可以通过依赖的方式引入到项目中来。代替了原来需要首先下载第三方 jar,再加入到项目中的方式。从而更好的解决了合作开发中依赖增多、版本不一致、版本冲突、依赖臃肿等问题。

    具体是怎么实现的呢?Maven 通过坐标系统准确的定位每一个构件,即通过坐标找到对应的 java 类库。

  • 项目信息管理工具

    能够管理项目描述、开发者列表、版本控制系统地址、许可证等一些比较零散的项目信息。除了直接的项目信息,通过 Maven 自动生成的站点,以及一些已有的插件,还能够轻松获得项目文档、测试报告、静态分析报告、源码版本、日志报告等非常具有价值的项目信息。

我们的开发过程中, Maven 是作为一个依赖管理工具的角色,我们把三方库上传到 Maven 的远程仓库中,项目构建的时候,通过 build.gradle 中的配置,去 Maven 仓库中找到对应的库,就开始下载对应的 aar 或 jar,并依赖到项目中。

Maven 仓库是什么?有哪几种?

当搜索上传 aar 到 Maven 仓库,会看到很多相关博客,其中上传的代码都大同小异,但是目标仓库却有很多种,大概可以分为以下几类:

  • JCenter
    标准的Maven仓库,由 Bintray 公司维护,上传这个仓库,需要注册 Bintray 账号,上传 library 到自己账号下的库地址下,然后同步 JCenter 中央仓库。
    JCenter 现在是 Google 官方默认的中央仓库。新项目创建时,RootProject 的 build.gradle 的 repositories 默认已经添加 jcenter() 仓库地址。

  • Maven Central
    同 Jcenter 一样是标准的 Maven 仓库,由 Sonatype 维护。上传这个仓库,需要注册 Sonatype 账号,上传 library 到自己账号下的库地址下,然后同步 Maven Central 中央仓库。

  • Nexus
    Nexus是一个 Maven 仓库管理器,用来搭建私有仓库服务器。公司几乎都会创建一个 Nexus 私有 Maven 仓库,用来存放公司内部的三方库,实现各个模块间的共享。另外好处就是便于管理,节省公网带宽,利用内网下载依赖项速度快。

因为有的童鞋没有私有 Nexus 仓库管理地址,所以我们这里用 jCenter 仓库做演示。

发布开源项目到到 JCenter 仓库

JCenter 的用户资源很多并且十分活跃,而且是 Google 官方默认的中央仓库,如果想开源一个你的项目, 上传到 JCenter 不失为是一个好想法。

上传步骤也很简单,总结来说只有四步:

  1. 注册一个 Bintray 账号,创建一个远程的库。
  2. Android Studio 本地准备好开源的项目,请注意是 Library Module。
  3. 将本地 Library Module 和第一步创建的远程的库连接起来,将 Library Module 打包成 的aar 和 pom 文件等上传到远程的库。
  4. 将远程库同步到 JCenter 中央仓库。

Step 1 : JCenter 远程库准备

1.去 Bintray 网站 注册一个账号。Bintray 账号有个人账号和企业账号之分,这里切记,要注册个人号。看下图箭头所指:

2.登录账号 ,点击 Add New Repository ,创建一个存储库,用来托管我们的代码。Name 可以任意,但是请填写 maven,后面会解释原因,Type 选择 Maven,剩下的是可选项,可以不填。

3.进入刚才创建的 Repository,点击 Add New Package ,创建 Package。Name 任意,Licences 选择 Apache-2.0,Version control 填入版本管理的地址,我填的是测试项目的 GitHub 仓库地址,其他项是选填,可以不填。

Step 2 : Android Studio 本地项目准备

此步骤,就是准备好一个要上传的 Android Library Module 就好啦!

这里我新建了一个空的库项目,在其中新建了一个 Java 类和 Activity,用来后面测试这个库好不好使。

测试无所谓,实际开发的话,还请知悉 Android 库项目开发官方文档,里面有给出开发注意事项,要好好听谷爹的话。

Step 3 : 本地和远程对接,开始上传

Bintray 公司提供了一个 Gradle 插件 gradle-bintray-plugin ,用来将项目上传到 Bintray 和 jCenter。

配置的步骤有很多,对于不太懂 Gradle 的童鞋,例如我,就算是 Copy & Paste 都很心累,而且粘贴复制后代码也不是很美观。

bintray-release 的出现解决了以上问题,我们直接使用 bintray-release 快速配置上传。

rootProject 的 build.gradle 添加 bintray-release 依赖

我使用的时候,bintray-release 的最新版本是 0.8.0.

buildscript {repositories {jcenter()}dependencies {<!-- classpath 'com.novoda:bintray-release:<latest-version>' -->classpath 'com.novoda:bintray-release:0.8.0'}
}

moudle 的 build.gradle 配置上传参数


apply plugin: 'com.android.library'
apply plugin: 'com.novoda.bintray-release'//添加//生成源文件
task sourcesJar(type: Jar) {from android.sourceSets.main.java.srcDirsclassifier = 'sources'
}//生成Javadoc文档
task javadoc(type: Javadoc) {source = android.sourceSets.main.java.srcDirsclasspath += 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 javadocJararchives sourcesJar
}//解决 JavaDoc 中文注释生成失败的问题
tasks.withType(Javadoc) {options.addStringOption('Xdoclint:none', '-quiet')options.addStringOption('encoding', 'UTF-8')options.addStringOption('charSet', 'UTF-8')
}//发布到 Bintray
publish {userOrg = 'duanruirui'           //bintray.com 注册的用户名groupId = 'com.jcenterlibrary'   //以后访问 jcenter上此项目的路径,一般和库项目的包名一致artifactId = 'JCenterDemo'       //bintray.com 创建的 Package 名publishVersion = '1.0.13'         //版本号desc = '这是一个不认真的版本说明' //版本说明,随意website = 'https://github.com/DRPrincess/DR_MavenDemo'    //关于这个开源项目的网站,随意
}

关于 publish 的参数,以上只是一部分,其实还有很多,具体看 配置publish闭包说明 ,需要解释一下,bintray-release 默认发布到 maven 仓库,这也是上一步 Add New Repository时,Name 建议填写 maven 的原因。如果有需要,需要自定义 Publication,详看 自定义 Publication。

上一步,我们 Add New Package 创建的 Package 的名字这里也用到了,原因在于,当三方库上传到 Maven 仓库后,Gradle 的引用路径是:

compile groupId:artifactId:version

groupId : 以后访问 jcenter上此项目的路径,一般和库项目的包名一致。
artifactId : 就是 Add New Package创建的 Package 的名字 。
version : 三方库的版本号。

一句 Gradle 命令完成上传

以上两部配置准备完毕,在 rootProject 的路径下执行这句命令即可完成上传。

./gradlew clean build generatePomFileForReleasePublication bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false

这行命令的中两个参数 BINTRAY_USERNAMEBINTRAY_KEY,需要换上你自己的bintray.com 账号信息,分别是用户名和 API Key。用户名很好得到,API Key 通过下图方式,可以拿到:

如果命令执行成功,会看到 BUILD SUCCESSFUL 字样。

然后去 Bintray 网站 登录后,就可以看到上传的的项目了,右侧可以看到上传的版本,我测试过很多回,截止到我截图的时间已经到 1.0.6了。

点击 Files,可查看上传的文件,如下是 1.0.6 版本上传的文件:

文件 意义
JCenterDemo-1.0.6-javadoc.jar 生成的 java 注释说明文档
JCenterDemo-1.0.6-sources.jar 项目源码,有这个之后,引用该库的时候,可以点进入看到源码
JCenterDemo-1.0.6.aar Android 库项目的归档文件,这是必不可少的文件
JCenterDemo-1.0.6.pom Maven的基础。它是一个XML文件,包含了 Maven 用来构建项目所需要的项目配置的信息,aar 是不能将库的依赖打进去的,那些依赖会记在 pom 文件中。

上传过程中遇到的问题

上传过程中,我祝福你不会遇到错误的情况,但是出现了,也不要烦躁,坑这个东西踩着踩着就平了,遇到错误去 bintray-release 的 issues 中查一下,或者问问谷爹,基本都能找到解决方法。

以下我遇到的问题:

  • 01:只上传了aar 文件,没有生成 pom 文件

    bintray-release 的文档上给出的命令 ./gradlew clean build bintrayUpload 只上传了 aar 文件,于是添加了一个 generatePomFileForReleasePublication,解决了这个问题,最终版就是上面示例的命令。

  • 02:其他三个文件都上传了,但是没有上传aar 文件

    这个问题,一般是项目构建失败导致的,我是因为资源文件名字重复,很奇怪,构建失败,但是其他文件上传上去了。遇到这个文件,仔细看一下构建的输出原因,总能解决的。

  • 03:Could not upload to ‘xxx’: HTTP/1.1 409 Conflict [message:Unable to upload files: An artifact with the path ‘xxx’ already exists]

    Maven 不能重复同一个版本,如果上传新版本,版本号要修改以下,一般是 +1 递增。

  • 04:Javadoc 文档生成失败,导致 build Failed

    错误信息:

    FAILURE: Build failed with an exception.* What went wrong:
    Execution failed for task ':jcenterlibrary:javadoc'.
    > Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): '/Users/admin/AndroidStudioProjects/DR_MavenDemo/jcenterlibrary/build/tmp/javadoc/javadoc.options'

    是因为中文注释的原因导致,修改 JavaDoc 的编码,就可以正常生成和显示了。解决方法是 Library Module 的 build.gradle 中添加下列代码:

    //解决 JavaDoc 中文注释生成失败的问题
    tasks.withType(Javadoc) {options.addStringOption('Xdoclint:none', '-quiet')options.addStringOption('encoding', 'UTF-8')options.addStringOption('charSet', 'UTF-8')
    }

Step 4 : Add to JCenter 中央仓库

最后一步,上传到 JCenter 中央仓库

未曾接触过这个的我,对这最后一步表示有很大的疑惑:

因为在上一步,我们已经将库项目已经推送到远程了,那为什么要有最后这一步呢?

在第三步项目成功上传后,已经开始使用 Gradle 依赖该开源库,在 Package 页面点击 Gradle 可以看到对应的依赖命令。

然后我试了下,发现要使用的话,会报找不到库的错误(1.0.8 的时候忘记截图了,用 1.0.14 测试的,道理是一样的,报错原因是因为找不到这个三方库),如下图:

如果想正确引用,需要将远程库所在 Repository 地址告诉 Gradle,这个地址从 Bintray 网站可以拿到,如下图:

然后 rootProject 的 build.gradle 中添加如下内容,即可正确引用:

allprojects {repositories {google()jcenter()maven { url 'https://dl.bintray.com/duanruirui/maven' } //添加}
}

那为什么使用其他第三方库,不需要加上三方库作者的 maven 地址呢?

就是因为作者将三方库同步到 JCenter 的中央仓库了。jcenter() 就是中央仓库的地址。所以为了方便使用,去掉这个三方库所在 maven 仓库地址的额外引用,我们最好将库同步到 JCenter 中央仓库。

同步的步骤非常简单,Package 详情页面有一个 Add to JCenter 按钮,点击进入,填写同步的理由,提交申请即可。通过之后会给发消息通知的。

审核的速度还是非常快的,上午提交的,下午就收到了通过的站内信,如下图所示:

现在已经同步到 JCenter 中央仓库,只通过一句代码引用你的第三方库啦~

写在最后

以上是本博客的全部内容,博客测试用的 Demo 我放在了 GitHub 上,地址在此:DR_MavenDemo,有问题欢迎提 issue。

之前没接触过这方面的知识,尝试使用的时候,再次感觉到自己的学识浅薄,实现过程中出现一些问题,大多一知半解,不知道问题的本质,希望以后的学习中,能够深入些,了解更多一点。

于是,下篇博客《Android-Nexus 搭建自己的 Maven 仓库 & Gradle 上传依赖包》,继续出发!

参考博客

《Maven与nexus》
《How to publish Android Library on Bintray/JCenter》
《放弃JitPack,发布Android Library到Bintray、JCenter》
《 Android 快速发布开源项目到jcenter》


欢迎关注个人微信公众号「浅浅同学的开发笔记」,最新的博客,好玩的事情,都会在上面分享,期待与你共同成长。

Android-发布项目到到 JCenter 仓库相关推荐

  1. Android Library上传到JCenter仓库实践

    前言 这段时间研究了下以前做app开发的时候并没有太过关注的JCenter仓库,在实际开发当中通常都是使用第三方开发者上传到jcenter的library,而我们使用的这些library或者plugi ...

  2. Android发布项目到外部仓库

    为什么80%的码农都做不了架构师?>>>    关于android发布仓库到外部项目的文章,目前大概为分两类: 一种是发布到bintray.jcenter上,一种是将项目上传到git ...

  3. android 项目部署,Android发布项目到JCenter

    JCenter是什么 大家应该都用过各种各样的Github上的第三方开源组件.类似这种效果的 compile 'wang.yuchao.demoforjcenterlibrary:DemoForJCe ...

  4. 使用gradle插件发布项目到nexus中央仓库

    文章目录 简介 Gradle Nexus Publish Plugin历史 插件的使用 Groovy DSL Kotlin DSL 插件背后的故事 总结 简介 Sonatype 提供了一个叫做开源软件 ...

  5. Android Studio项目build.gradle更换仓库镜像

    由于Android Gradle 7.1+新版本依赖发生变化,原来在工程build.gradle的buildscript和allprojects移动至setting.gradle并改名为pluginM ...

  6. linux gradle仓库位置,如何在Android Studio中使用Gradle发布项目至Jcenter仓库

    简述 目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布. Library的转换和引用 博主的 ...

  7. android studio 库项目,Android Studio 发布项目到jcenter库

    第一次发布项目到jcenter,虽然网上有很多教程了,但是过程还是比较曲折.不过最终还是找到简单的方式,使用com.novoda.bintray-release实现发布. 认识jcenter 我们经常 ...

  8. Android开源项目发布jCenter

    最近有这方面需要,所以研究了一下如何将自己的工程项目发布到jCenter上去.方法有很多,可以是Bintray,maven,jitPack.io等等. 本次发布使用的Bintray,所以稍后先从如何使 ...

  9. Android studio 使用Gradle发布Android开源项目到JCenter 总结

    1.注册账号 先到https://bintray.com注册一个账号.  这个网站支持 github 账户直接登录的 2.获取  bintray.user  和 bintray.apikey      ...

最新文章

  1. 页面中如何引用外部的HTML(四种方法)
  2. UVA 10803 Thunder Mountain
  3. JavaScript学习总结(三)——逻辑And运算符详解
  4. python爬虫 隐藏身份及设置代理
  5. 强大的CSS3动画库animate.css
  6. apache启动失败_请检查相关配置.√mysql5.1已启动._1、Apache启动失败,请检查相关配置-百度经验...
  7. win7宽带已连接但是有感叹号无法上网的解决方法
  8. linux upstart机制简介及封装应用
  9. php mysql.dll 下载_php_mysql.dll下载|
  10. 未定义函数或变量 'wavplay'。原因:2014a已经移除函数
  11. 说几个打工人要避开的坑
  12. 计算机视觉论文-2021-07-13
  13. linux系统start x,linux的startx问题
  14. 投影仪应该怎么选择?数码粉总结目前最好的家用投影仪
  15. vue实现PS效果,鼠标拖拽指令、十字辅助线、鼠标选点、打印页面指定内容、生成随机id、颜色选择器、div上输入文字(类似QQ截图输入文字)、vue图片上传转base64...
  16. 电脑上怎样下载喜马拉雅里的 Mp3
  17. 数据结构-栈基本功能的实现
  18. JavaScript 原型链总结(一)
  19. TFT显示模组是什么?tft显示模组有什么功能?
  20. windows下python利用f2py调用Fortran

热门文章

  1. 让英文操作系统正确显示中文
  2. 去了家新公司,技术总监不让用 IntelliJ IDEA想离职了
  3. 飞书文档导出pdf不带书签/大纲 问题
  4. codeforces 1041D Glider
  5. 什么叫冷备用状态_在电力设备运行中有:运行、热备用、冷备用、检修四中状态,请问什么是热备用、冷备用?...
  6. java模仿贴吧发帖_贴吧发帖顶贴的新方法,解析了这些技巧你也可以成大神!...
  7. 细说LoadRunner参数化
  8. 2021CCPC“第一场”网络赛 GCD on Sequence(思维,线段树)
  9. 7135制作自动量程电压切换_基于STM32和ICL7135的数字电压表设计
  10. 【菜鸟读论文】2019_Guided Stereo Matching