30分钟搭建一个android的私有Maven仓库

原文链接 : A PRIVATE MAVEN REPOSITORY FOR ANDROID IN 30 MIN

建立你自己的Maven库和上传artifacts,这是一个相当艰巨的任务。最近,我在这方面获得了一定的经验,希望和大家分享:通过Artifactory建立Maven库并使用Gradle自动上传artifact。

在不到30分钟,你将有一个可以运作的私有Maven库,通过配置gradle的buildscripts自动上传artifact。

请注意,这里提出的有关内容包括但不仅局限于安卓,他实际的使用范围更广。

设置一个库管理器

首先,我们需要确保我们有一个Maven库可以用于上传我们的artifact。根据Maven,你应该使用一个库管理工具:

最佳实践-使用库管理器
库管理器是一个专门的服务器应用程序,用于管理二进制组件的库。The usage of a repository manager is considered an essential best practice for any significant usage of Maven.

为什么是ARTIFACTORY?

虽然有一些其他的选项可供选择,我个人选择artifactory因为:

  • 清晰且有吸引力的用户界面
  • 超快速配置
  • Gradle插件
  • 用户访问控制
  • 自由和开放来源

更多信息请查看alternatives, checkoutfeature comparison matrix或者回顾 Artifactory的特性.

确定你安装了JAVA SDK 8

在你开始之前,请确定你现在已经安装了Java 8,否则Artifactory将无法运行。你可以通过java -version这个命令获取Java的版本:

$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

如果输出版本小于1.8.X,你应该下载和安装一个新的Java SDK。
请注意,如果你没有Java 8的错误,看起来有点诡异:

Aug 05, 2015 9:29:31 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: One or more listeners failed to start. Full details will be found in the appropriate container log file

安装 artifactory

这一步,简单的难以置信。只需下载最新版本的artifactory,解压文件,然后运行与你的平台对应的artifactory可执行文件即可。

youtube

通过访问http://localhost:8081/artifactory/,你就可以知道是否安装正确。在该页面,你可以体验到artifactory的一些特性。现在,不要担心所有的设置,我们稍后将配置我们所需要的设置。

配置Gradle自动上传Android artifact

通过配置一个新的Gradle任务,我们可以上传一个简单的文件。

在最上层的build.gradle文件(这里指文件路径)添加一个关于Artifactory Gradle 插件的引用:

buildscript {
    dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
    }
}

接下来,在你的库中,我们将需要两个新的插件:一个准备Maven artifact maven-publish,另一个上传archives到artifactory com.jfrog.artifactory

apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'

每一个Maven artifact都由以下三个参数确定:

  • artifactId:库的名称
  • groupId:通常库的包名
  • version:区别同一artifact的不同版本

一般的,我们将在build.gradle文件定义最后两个变量。

def packageName = 'com.jeroenmols.awesomelibrary'
def libraryVersion = '1.0.0'

artifactId需要和assemblerelease任务输出的文件名相匹配。因此我们要重命名库模块指定输出文件名。我个人比较喜欢第一种方法,可以通过下面这种方式得到artifactId

project.getName() // the ArtifactId

现在我们需要配置maven-publish,这样就知道哪一个artifactory将发布到Artifactory。我们的目的,我们是引用`***-release.aar文件,他是由assemblerelease任务生成。请注意,我们可以通过更改库项目名称来预测这个名称:

publishing {
    publications {
        aar(MavenPublication) {
            groupId packageName
            version = libraryVersion
            artifactId project.getName()

            // Tell maven to prepare the generated "* .aar" file for publishing
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
      }
    }
}

最后,我们需要配置com.jfrog.artifactory 插件,来指定artifact发布到的库。为简单起见,我们将上传一个artifact到本地运行的Artifactory实例(http://localhost:8081/artifactory),默认放在libs-release-local库中。请注意,在本例中,用户名admin,密码password是硬编码的形式。我们希望以后有一个更好的解决方案。

artifactory {
    contextUrl = 'http://localhost:8081/artifactory'
    publish {
        repository {
            // The Artifactory repository key to publish to
            repoKey = 'libs-release-local'

            username = "admin"
            password = "password"
        }
        defaults {
            // Tell the Artifactory Plugin which artifacts should be published to Artifactory.
            publications('aar')
            publishArtifacts = true

            // Properties to be attached to the published artifacts.
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            // Publish generated POM files to Artifactory (true by default)
            publishPom = true
        }
    }
}

部署 ARTIFACTS

现在,我们通过配置Gradle的buildscripts,运行以下命令轻松部署artifactory:

gradle assembleRelease artifactoryPublish

注意,我们在调用调用的实际artifactoryPublish任务前,会先调用assembleRelease,这取决于我们在上一节定义的方式。

你可以通过管理员凭据登陆localhost:8081,知道有没有上传成功。

使用ARTIFACTS

为了保证另一个项目也可以引用这个artifact,我们需要在根目录下的build.gradle文件中,把我们的仓库信息添加到仓库列表中。

allprojects {
    repositories {
        maven { url "http://localhost:8081/artifactory/libs-release-local" }
    }
}

然后,我们只需要在主工程的build.gradle文件中添加artifact作为依赖就可以了:

dependencies {
    compile 'com.jeroenmols.awesomelibrary:1.0.0'
}

WRAP-UP
总结

恭喜你!你完成了利用gradle生成和上传你的artifact 带Maven仓库。

下一篇博客 ,我将继续学习一下几点:

  • 库项目的依赖
  • 配置你自己的仓库
  • 使用权限管理

记得更改build.gradle 里的账号、密码

我已经上传了一份 例子 到github供你参考。

Android 安全的其它话题

在本章中,我们会涉及到与 Android 安全相关的其他主题,这些主题不直接属于已经涉及的任何主题。 6.1 Android 签名过程 Android 应用程序以 Android 应用包文件(.apk文件...

发布于:2年以前  |  2471次阅读  |  详细内容 »

Android 应用层安全

虽然在这一节中我们描述了应用层的安全性,但是实际的安全实施通常出现在到目前为止描述的底层。 但是,在介绍应用层之后,我们更容易解释 Android 的一些安全功能。 5.1 ...

发布于:2年以前  |  2980次阅读  |  详细内容 »

Android 框架层安全

如我们在第1.2节中所描述的那样,应用程序框架级别上的安全性由 IPC 引用监视器实现。 在 4.1 节中,我们以 Android 中使用的进程间通信系统的描述开始,讲解这个级别上的...

发布于:2年以前  |  2423次阅读  |  详细内容 »

Android 本地用户空间层安全

本地用户空间层在 Android 操作系统的安全配置中起到重要作用。 不理解在该层上发生了什么,就不可能理解在系统中如何实施安全架构决策。 在本章中,我们的主题是 Android ...

发布于:2年以前  |  2147次阅读  |  详细内容 »

Android Linux 内核层安全

作为最广为人知的开源项目之一,Linux 已经被证明是一个安全,可信和稳定的软件,全世界数千人对它进行研究,攻击和打补丁。 不出所料,Linux 内核是 Android 操作系统的基...

发布于:2年以前  |  2528次阅读  |  详细内容 »

Android安全概述

Android 安全架构的理解不仅帮助我了解 Android 的工作原理,而且为我开启了如何构建移动操作系统和 Linux 的眼界。 本章从安全角度讲解 Android 架构的基础知识。 在第 1....

发布于:2年以前  |  2758次阅读  |  详细内容 »

使用Robolectric的参数化测试

原文链接 : Parameterized testing with Robolectric 在目前的项目中我们使用Robolectric为Android应用程序编写单元测试,它一直都干的不错。最近我需要编写一个测试用例,通...

发布于:2年以前  |  1101次阅读  |  详细内容 »

Android MVPR 架构模式-Part1

原文链接 : MVPR: A FLEXIBLE, TESTABLE ARCHITECTURE FOR ANDROID (PT. 1) 全面的单元测试能提高内部系统的代码质量,因为系统的每一个组件都需要被测试,因此每个单元...

发布于:2年以前  |  1715次阅读  |  详细内容 »

使用Espresso进行UI测试

原文链接 : Using Espresso for Easy UI Testing 在我和很多Android开发者聊天的时候我注意到他们在开发的过程中并不注重测试这一环节,原因是他们认为Android测试太难实现...

发布于:2年以前  |  575次阅读  |  详细内容 »

从网页中触发Android原生的分享Intent

原文链接 : Triggering a native Share intent on Android from the web 这是很久之前的事了,在我访问了班加罗尔(印度南部城市)的FlipKart以及进行了一场关于是否存在一...

发布于:2年以前  |  771次阅读  |  详细内容 »

Android高性能JSON数据解析

原文链接 : Hi Performance JSON Parsing in Android 有时Android开发中我们调用的1/3的API需要我们下载JSON数据。现在我有一个客户端调用一个API接口用于为设备同步数据。...

发布于:2年以前  |  1479次阅读  |  详细内容 »

在Activity中使用Thread导致的内存泄漏

注:这篇博文涉及的源码可以在 GitHub 上面下载哦 做 Android 开发最常遇到的问题就是在 Activity 的生命周期中协调耗时任务,避免执行任务导致不易察觉的内存泄漏。不妨...

发布于:2年以前  |  1065次阅读  |  详细内容 »

使用RxJava缓存Rest请求

原文链接 : Subscribe It While It's Hot: Cached Rest Requests With RxJava 免责声明: 在这篇文章中,我尝试去用正确的方法来解决一个常见的问题。我仍然正在整理我脑袋...

发布于:2年以前  |  2084次阅读  |  详细内容 »

使用ACTION_PROCESS_TEXT创建自定义文本选择动作

原文链接 : Creating custom Text Selection actions with ACTION_PROCESS_TEXT 使用ACTION_PROCESS_TEXT创建自定义文本选择动作 Android 6.0引入了一个新的浮动文本选择工...

发布于:2年以前  |  1160次阅读  |  详细内容 »

markdown转换教程 #

发布于:2年以前  |  653次阅读  |  详细内容 »

Gradle小知识#3:任务的顺序

原文链接 : Gradle tip #3: Tasks ordering 我发现在使用Gradle的过程中遇到的很多问题都跟任务的顺序有关系,不管是已经存在的任务还是我自定义的任务。很显然,如果任务...

发布于:2年以前  |  2174次阅读  |  详细内容 »

Android 自动截屏工具

原文链接 : Automating Android Screenshots 随着mac版本AndroidTool的发布,获取android应用截屏变得非常简单。与此同时,感谢开发商!这对于我们开发者来说真是太好了! ...

发布于:2年以前  |  1126次阅读  |  详细内容 »

在Android开发中使用RxJava

ReactiveX是专注于异步工作的API,它将异步事件的处理与观察者模式、迭代器模式及函数式编程相结合了起来。实时地处理返回数据是在工程中经常出现的情景,所以使用高效、可...

发布于:2年以前  |  1780次阅读  |  详细内容 »

使用Androguard静态分析APK

到目前为止,在之前关于Android逆向工程的介绍中,我们已经知道了APK文件的格式,如何使用使用AAPT,提取应用程序中和Android SDK相关的有用信息,如何将DEX字节码转化成更具...

发布于:2年以前  |  3601次阅读  |  详细内容 »

Kotlin for Android (III)/ 扩展函数与默认值

原文链接 : Kotlin for Android (III): Extension functions and default values 现在你已经了解Kotlin基础与如何配置你的项目,是时候谈论Kotlin能为我们做哪些Java做不到...

发布于:2年以前  |  1572次阅读  |  详细内容 »

最多阅读

简化Android的UI开发 1年以前  |  444417次阅读
30分钟搭建一个android的私有Maven仓库 2年以前  |  3321次阅读
Android设计与开发工作流 1年以前  |  3229次阅读
Google Enjarify:可代替dex2jar的dex反编译 2年以前  |  3122次阅读
Android多渠道打包工具:apptools 2年以前  |  2680次阅读
Google Java编程风格规范(中文版) 2年以前  |  2646次阅读
Android UI基本技术点 2年以前  |  2638次阅读
Android Studio 生成so文件 及调用 9月以前  |  2565次阅读
Android权限 - 第一篇 2年以前  |  2520次阅读
Stetho 2年以前  |  2448次阅读
2015 Google IO带来的新 Android 开发工具 2年以前  |  2382次阅读
Android死锁初探 10月以前  |  2376次阅读
听FackBook工程师讲*Custom ViewGroups* 2年以前  |  2294次阅读