如何通过JCenter 和 Mavenue Central 从 Android Studio 分发自己的Library库

  在Adnroid Studio中,如果你想在你自己的项目中引用其他任何的第三方库。只需要在项目的build.gradle中添加如下简单的一行代码。

 就这样,这个library库还不能被使用。

  这个看起来很酷,但是你可能好奇,这个库Android Studio 是从哪里查询来的呢?这篇博客将会详细介绍整个工作流程,包括怎样发布你自己的库,并分享给世界其他地方的开发者。这不仅使世界变得美好,而且让你自己看起来也很牛x。


 Android Studio 从哪里获取库?

 先从第一个简单的问题开始,相信你也不是完全知道Android Studio从哪里获取到库。难道是谷歌给我们搜索出来的,并下载到了我们的项目中么?
 

 好吧,这个并不是完全正确的。Android Studio 从 Maven 存储库服务器中下载库文件,这个被我们定义到了build.gradle中。(Apache Maven是Apache工具,它提供了一个分发库的文件服务器)。基本上这里只有2个标准的服务器用于托管Android的库,如JCenter和Maven Central。


JCenter

JCenter 是由bintray.com托管的Maven存储库。你可以在这里http://jcenter.bintray.com/找到整个仓库。
为了在你自己的工程中使用这个仓库,你需要定义一个仓库,像下边这样,在build.gradle文件中。



Maven Central

Maven 是由sonatype.org托管的Maven存储库。你可以在这里https://oss.sonatype.org/content/repositories/releases/找到整个仓库。
为了使用Maven 存储库,你可以定义一个仓库,像下边这样,在build.gradle文件中


需要注意一点,尽管JCenter和Maven Central 是两个标准的安卓存储仓库,但是他们被托管在两个完全不同的地方。由两个提供者提供,并且相互之间没有任何的关联。在Maven Central中可能找不到jcenter中可用的内容,反之亦然。


除了这两个标准的服务器,我们还可以自己定义特定的maven存储库服务器,以防我们使用一些开发人员的库来自己的服务器上托管他们的库。在这种情况下,Twitter的Fabric.io在https://maven.fabric.io/public上托管自己的Maven Repository。如果你想使用任何Fabric.io的库,你必须定义自己存储库的地址连接,像下边这样。


随后你可以通过相同的方法,使用任何库文件。


但是哪一个更好呢:将库上传到标准服务器或托管我们自己的服务器?答案是前一种。是我们自己的库可以被公共使用。另一个开发人员不应该定义任何东西,除了一行代码定义依赖项的名称。所以在这篇文章中,我们将专注于只有JCenter和Maven Central,为开发人员提供更好的体验。

除了Maven Repository之外,FYI实际上还有一种类型的存储库,他与AndroidStudio上的gradle一起使用,他被成为常春藤存储库,但从我自己的经验来看,我从来没有见过任何人使用它,之前包括我。所以我将知识在这篇文章中忽略这种类型的存储库。


了解JCenter和MavenCentral

 想知道为什么那里只有一个,但是有两个标准的存储库?

 事实上,它们具有相同义务的粗出库:托管Java/Android库。将开发人员的库上传到哪一个或两者可以使开发人员的选择。

 首先,Android Studio 选择Maven Central作为默认的存储库。一旦你从旧版的Android Studio 创建一个新的工程,mavenCentral()将会自动在build.gradle中定义。

 但是呢,有个比较严重的问题,Maven Central 对开发人员并不友好。而且将库文件上传到这里是很困难的。为了能够上传成功,开发人员需要一定的能力。而且还有一些更多的原因,例如安全问题等等。Android Strudio 团队决定将默认存储库切换为JCenter,因为您可以看到,一旦您从最新版本的AdnroidStudio创建一个新项目,JCenter()将自动被定义而不是mavenCentral()。

他们决心从Mavnen Central 切换到JCenter有许多的理由。这里有一些比较主要的:

  -jcenter 分发库是通过CDN,这就意味着开发人员可以体验很快的下载速度。

  -jcenter 是世界上最大的java 存储库。所以无论在Maven Central中提供什么,都可以在jcenter上获得。换句话说,    jcenter是maven Central 的超集。

  -将我们自己的库上传到存储库也是非常容易的。不需要签署或者做任何复杂的事情,就像我们必须在maven centr      上。
  
  -优化的UI
 
  -如果你想将自己的库文件上传到maven central,你可以轻松的点击bintray网站(和一次性设置一些步骤)。

 
  综合以上观点并且从我的个人体验上来说,我不得不说这真是一个聪明的决定,转换默认的仓库到jcenter。

  所以本篇文章将着重介绍jcenter,直至你能自己成功的上传自己的库文件到jcenter。之后可以轻松转发给maven central。


gradle是如何从仓库里拉取一个库文件的呢?

在我们讲如何上传一个库文件到jcenter之前,我们应该先说说gradle是如何从一个仓库中获取库文件。例如,当我们在build.gradle中键入下面的内容时,这些库文件如何神奇的下载到您的项目中呢?

首先我们应该先了解这些库文件字符串的含义。它包含三个部分:

以上面的内容为例,GROUP_ID 是com.inthecheesefactory.thecheeselibrary, ARTIFACT_ID 是fb-like ,VERSION是 0.9.3.

也就意味着,GROUP_ID 是用来定义库组的名称。在同一个上下文中,可能会有多个库文件在不同的工作中工作。如果库位于同一个组中,它讲共享相同的GROUP_ID。一般来说,我们将其命名为开发人员的软件包名称,然后使用库组的名称,例如com.squareup.picasso。然后在ARTIFACT_ID中定义库的真实名称。对于VERSION,只是一个版本号。虽然它可以是对任何文本,但是我建议将其设置为x.y.z的格式,如果需要,可能会跟随-bate。

 这里有一些关于Square的真实例子。你可以注意到,每个人都可以很容易地认知库和开发者的名字。

添加了以上依赖以后,将会发生一些什么呢?简单来说,Gradle 将会询问Maven 存储服务器,这个依赖库是否存在,如果存在,gradle将会根据GROUP_ID/ARTIFACT_ID/VERSION来请求库文件,比如,你可以找到com.squareup:otto:1.3.7从http://jcenter.bintray.com/com/squareup/otto/1.3.7 https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/.

找到文件之后呢,AndroidStuido 将会下载这些文件到我们本地,并且根据我们的需求编译项目。就这样,整个过程没有什么复杂的。


我相信你应该清楚的知道从存储库中提取的库文件,不是在存储库服务器上托管的jar或者aar文件。它比较像是自己的项目文件。但是,从gradle获得的依赖系统获得的最大收益是你不必做任何事情,只需输入一些文本即可。库文件将会很快的应用的您的项目中,也可以用于版本控制系统。


了解一个aar文件格式

等等,我说有两种可以在仓库,jar和aar上托管的库文件。jar文件是什么,我相信大家都知道。但是什么事aar文件呢?
aar文件是在jar文件之上开发的。这是由Android Library需要嵌入一些Android 特定的文件(如AndroidManifest.xml,Resources,Assets 或者 JNI等),而这些不是jar文件的标准。所以aar被发明来涵盖所有这些内容。基本上它是一个普通的zip文件,就像jar一样,但是其中具有不同的文件结构。jar文件嵌入到具有classes.jar名称的aar文件中。其余的列在下面:

- /AndroidManifest.xml (mandatory)
- /classes.jar (mandatory)
- /res/ (mandatory)
- /R.txt (mandatory)
- /assets/ (optional)
- /libs/*.jar (optional)
- /jni/<abi>/*.so (optional)
- /proguard.txt (optional)
- /lint.jar (optional)

正如你看到的,aar文件是专门为Android设计的。所以本文将教你如何以aar格式创建和上传库。


如何上传自己的库文件到jcenter

现在,我相信你应该有一些基本的知识了解仓库的整个工作流程。现在让我们开始最重要的部分:上传工作。目标是如何将我们的库文件上传到http://jcenter.bintray.com。一旦我们能做到,这个库将会被发表。但是呢,有两件事需要被关注一下:如何创建一个aar文件,以及如何将内置文件上传到存储库?

虽然他需要一些步骤,但我必须说,这个完全不难,因为bintray已经准备好一切,都很方便,你可以现在下图中了解整个过程。


 而且由于有很多细节,所以让我把这个过程分解成7个部分,这样我可以一步一步的讲解。

 Part1:在bintray上新建一个package
 
首先呢,你需要在bintray上创建一个package。在创建这个之前,你需要先在bintray上创建一个账号,然后才能创建一个package。
 Step1:在bintray点击打开链接上注册一个账号,整个过程很简单,自己操作就好。
 Step2:注册成功后,登录网站,首界面中点击
创建新的存储库,并选择Maven类型
 

Step3:给我们的库文件创建一个新的package。

Step4:填写基本的信息。




尽管这里没有明确说明PackageName有哪些规则,但是这里有一些名称约定的规则。只需将所有的字符设置为小写,并用连字符-分隔每个单词,例如fb-like。

填好所有的信息后,点击create package按钮,完成创建过程。

Step 5:网站将会重定向到编辑包界面,点击编辑包文本下的包名,进入包的详细信息页面。

至此,在bintray上你就有了自己的maven仓库,可以准备上传库文件到仓库中。Bintray账户注册现已完成。下一个可以使用的是Sonatype,即Maven Central提供商。


Part 2:给Maven Central创建一个Sonatype账户。

注意:如果你不打算上传库到Maven Central,则可以跳过第2部分和第3部分。无论如何,我建议你不要跳过,因为有很多开发人员仍在使用这个存储库。

就像JCenter一样,如果要通过Maven Central分发你的库文件,你需要在其提供商网站Sonatype注册一个账户。

你需要知道的是你必须创建的账户是Sonatype站点上的JIRA问题跟踪器账户。为此,请转到Sonatype Dashboard,然后注册一个账户。

一旦你完成了,你必须要求将自己的库文件分发给Maven Central。无论如何,这个过程根本没有任何意义(至少对我来说),因为你要做的是在JIRA中创建一个问题,让他们允许你上传你提供给Maven Central 的GROUP_ID的图书馆。

要创建一个类似的问题,请转到Sonatype Dashboard并使用创建的账户进行登录。然后点击顶部菜单中的创建按钮。

请填写以下信息:
Project:社区支持-开源项目存储库托管
Issue Type:新项目
Summary:你的库的名称总结,例如Cheese Library
Group Id:GROUP_ID,例如com.inthecheeselibrary。获得批准后,每个库都将以com.inthecheeselibrary开头,将被允许上传到存储库,例如com.inthecheeselibrary.somelib
Project URL:项目路径,通常放置github上的项目路径。
SCM URL:源代码控制的URL,通常放置的也是github上的源代码路径。

保存其余未修改的内容,然后点击创建。然后等待一周或这个更多时间,之后你将被授予访问权限,以将你的库文件分发到Maven Central。

最后一件事是在Bintray Profile的账户选项卡中提供你的Sonatype OSS的用户名

Part 3:启用自动登录Bintray

如上所述,我们可以通过JCenter将库文件上传到Maven Central,但是要做到这一点,我们需要首先签署这个库文件。bintray提供了一个技巧,可以轻松地通过web界面进行操作,从而允许库在上传后自动签名。

第一步是通过命令行通过以下命令生成一个密钥。如果你是用的是windows,请在cygwin下执行。

这里有一些必须填写的字段。默认值可以应用于大多数部分,但是对于某些字段,你需要自己输入适当的值,比如你的真实姓名,密码等。

一旦密钥创建成功,使用下面的命令来获取创建的密钥的更多信息。

如果没有问题的,相关信息将会如下展示

现在我们必须将公钥上传到密钥服务器,使其有效。为此,请在本示例中的01ABCDEF的pub行中的2048R /之后,调用以下命令并将PUBLIC_KEY_ID替换为8位十六进制值。

然后,使用以下命令将公钥和私钥作为ASCII标准格式导出,并将[email protected]替换为上一步中用于创建自己的密钥的电子邮件。

打开Bintray的编辑文件界面,找到GPG Signing.使用上一步导出的public_key_sender.asc和private_key_sender.asc文件中的内容填充公钥和私钥。

点击update,保存更新。

最后一步,找到主界面中的maven仓库
点击Edit按钮,进入编辑界面

勾选GPG Sign uploaed files automatically 





点击update按钮,保存当前操作,就这样,从现在开始,上传到我们的maven存储库的每个library都将自动签名,并可以一键点击转发给maven central。

请注意,这是一次一次性的操作,并且也将应用于在此之后创建的每个单独的库。

Bintray 和 maven central现在已经准备好了,现在转入到Android studio 的部分。

Part 4 :准备好一个Android Studio工程。

在很多情况下,我们可能需要将多于1个库上传到单个项目中的存储库,同时我们可能不需要上传任何内容。所以我建议最好的结构是将每个部分分为模块。基本上我建议你拆分至少两个模块,一个应用模块用于库使用示例,另一个是一个库模块,其中包含你要上传到存储库的源代码。请注意,如果你想在项目中拥有多个库,请随意创建另一个模块,最好是每一个库,对应一个模块。

我相信每个人都知道如果创建一个library module,所以这在个模块就不往深入讲解了。创建一个简单的library模块

下一步应用bintray的配置到自己的工程中。为了完成这个,我们需要在工程的build.gradle文件中添加如下部分依赖。

将gradle构建工具版本设置为1.1.2或者更高版本是很重要的,因为在以前的版本中存在严重的错误。在这个例子中我们使用最新的1.2.3.


接下来,我们将通过修改local.properties来定义用于bintray身份验证的用户名和api密钥以及创建密钥的密码。我们需要把这些东西放在这个文件中,原因是这些信息是敏感信息,身份信息,不应该被分享到任何地方,包括版本控制。幸运的是,自创建项目以来,该local.properties文件已经添加到.gitignore。因此,这些敏感数据将无法无意上传到git服务器。


在local.properties这里添加三行配置代码

第一行是用户名,第二行是app_key,在bintray中的edit profile界面中可以获得。第三行是gpg密码,创建好之后保存。


最后一个需要编辑的文件是build.gradle ,打开并且添加以下代码


将bintrayName更改为上面创建的包名称,并且还可以更改其余的配置信息。从上面的脚本中,每个人都可以使用这个库文件,使用以下的gradle内容添加依赖

最后一步是应用两个脚本,用于构建库文件,并将构建的文件上传到bintray,通过在文件末尾附加相同的build.gradle文件(为了方便,我使用的是github托管的文件的直接链接)

完成!现在你可以准备上传库文件到bintray了。


Part 5 : 上传库文件到你的bintray空间。

现在可以上传库文件到你的bintray了,做如下操作,请打开android studio 的Terminal控制台

第一步是检查代码的正确性,并构建库文件(aar,pom等),键入以下命令来执行此操作。

如果这里没有什么问题,将会显示

现在我们已经进行了一半,下一步是使用以下命令将内置文件上传到bintray。


如果他显示如下所示,那么就是成功了。


在bintray web界面检查你的包,你会在版本区域看到版本变化。


点击它,并查看文件选项卡,你将看到上传的库文件放在这里。


恭喜你,你自己的库文件已经上传成功,并且任何人都可以使用它了。

但是呢,不要高兴的太早了,这个库文件现在仅仅是在你自己的maven存储库中,还没有到jcenter中。如果有其他的开发者想使用这个库文件,他们必须添加如下依赖


你可以从bintray web界面找到你自己的maven 仓库的链接,或者只是用你的bintray用户名替换nuuneoi的。我希望你自己尝试点开这个链接,看看里面究竟发生了哪些变化。


如上所述,共享库的最佳做法不是让开发人员定义这样的复杂的东西。想象一下,我们必须添加10个网址来使用这10个存储库么?这简直是噩梦,所以让我们的库文件从我们的存储库传递到jcenter,将极大的提高开发人员的用户体验。


Part 6 :同步自己的库文件到Jcenter

同步自己的库到JCenter,这个过程是很简单的,只需要在网页上点击Add to JCenter即可,


然后什么都可以不填,直接点击发送按钮即可。


接下来就是需要等待2-3个小时,需要bintray团队审核通过。一旦同步申请通过,你就会收到一封邮件,提醒你已经审核通过。审核通过以后可以查看网页接口,你将可以在Linked To 界面看到一些变化。


从这以后,任何的开发者都可以通过Jcenter仓库,使用你的库文件了,只需要添加以下简单的一行代码。



想检查你的库二进制文件是否存在,你可以访问http://jcenter.bintray.com 并浏览到与你的库的组ID和工件ID匹配的目录,比如在上这个例子中,地址应该是com -> inthecheesefactory -> thecheeselibrary -> fb-like -> 0.9.3


请注意,链接到JCenter是一次性的动作,从现在开始,如果你在包中进行任何修改,例如上传新版本的二进制文件,删除旧版本的二进制文件等。此更改也会影响到Jcenter位于不同的位置,所以你可以需要等待2-3分钟左右,才能让Jcenter同步更改。


请小心一下,如果你决定删除整个软件包,则在这种情况下,放置在JCenter存储库中的库文件将不会被删除,而他们像僵尸文件一样,没有人可以删除她了。所以我建议你,如果你想删除整个软件包,请先删除web界面中的每一个版本,然后再删除软件包。


Part 7 :将库文件转发到Maven Central

并不是所有的安卓开发者都使用JCenter库,仍有一部分开发者使用mavenCentral,所以将库上传到Maven Central 也是同样重要的。

将存储库从Jcenter转到Maven Central,你需要首先实现两个任务:

 1)Bintray包必须已经链接到Jcenter

 2)Maven Central 上的存储库已经被批准开放

如果你已经通过了这些资格,将库文件转发到 Maven Central 的方法非常简单。只需要在软件包详细信息页面上点击Maven Central 链接。


一旦成功完成,成功同步和关闭的回购将显示在上次同步状态。但是如果有任何问题,他将显示在上次同步错误中。你必须根据情况修复问题,因为可以上传到Maven Central的库条件是相当严格的,例如 + 号不能再库的依赖关系定义的版本中使用。

一旦完成你可以在Maven Central 仓库中找到与库group/artifact ID 相匹配的目录中的二进制文件。在这个例子中,应该是com -> inthecheesefactory -> thecheeselibrary -> fb-like -> 0.9.3


恭喜你,已经成功了。虽然它需要相当多的步骤,但步骤是非常简单的。大部分是一次性的,一旦设置成功后,你几乎不需要做其他额外的步骤。


文章有点长,但希望对你是有帮助的。希望能在这里看到你伟大的库文件!!!


翻译文章, 文章来源:

https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

在最新版本的上传过程中,可能界面展示略有不同, 大致的操作过程是一样的,希望对你有帮助。






猜你喜欢

转载自blog.csdn.net/lxm20819/article/details/77963282