分分钟手摸手带你做自己的maven库

来源:互联网 发布:java流程引擎activity 编辑:程序博客网 时间:2024/05/19 08:40

写在前面

并不是什么高端的东西,大神请忽略,不会的请看这里。可能实际的用处并不是很大,但是你学会了,就可以在不会的人面前装一把,哈哈!ps:这要是让认识我的人看到,会怎么想我o(╯□╰)o

准备

首先,你要有一个artifactory。它是什么呢?就是用它搭建一个maven库。这部分我没有做,我使用的是公司的,公司运维分分钟给你搭一个。没有的话,看下边我抄的教程。
原文链接:https://jeroenmols.com/blog/2015/08/06/artifactory/

为什么是ARTIFACTORY?

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

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

确定你安装了JAVA SDK 8

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

$ java -version
java version “1.8.0_51”

如果输出版本小于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可执行文件即可。
通过访问http://localhost:8081/artifactory/,你就可以知道是否安装正确。在该页面,你可以体验到artifactory的一些特性。现在,不要担心所有的设置,我们稍后将配置我们所需要的设置。

配置Gradle自动上传Android artifact

  • 重点来了,从这之后都是重点(敲黑板),毕竟我是搞Android的,要给Android划知识点,但是以下知识不仅限于Android。

通过配置一个新的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'}

Congratulations! You now have a fully working Maven repository manager with a Gradle script to generate and upload your artifacts.
以上就是基本的流程,但是还有个依赖库的问题,下面我会从头走一遍,并说明这个问题。

实际应用流程

First

  • 根build.gradle添加

第一步

Second

这里写图片描述

Third

这里写图片描述

  • 可以看到这里多出了一个pom,但是上文没有提及。如果你不写这个,你把aar或者jar包传上去之后,服务端只有jar包,你用gradle引入,会把jar包下载下来。如果你在编写jar包的时候还用了其他的库,比如compile ‘org.apache.commons:commons-lang3:3.5’,那么你在运行的时候就会报找不到类。你编写的库中引入其他依赖,但是在生成jar包时,就只打包了你编写的代码,没有打包其他依赖的代码进去。你在别的项目中直接引入自己的jar包,就会报找不到类。所以jar包的依赖关系也应该上传到maven库中。
  • 下面看一下maven库中都含有哪些内容
    这里写图片描述

一共6个文件,MD5和sha1就不说了,jar包是我们要引入的,那pom是什么呢?
这里写图片描述

那怎么上传依赖关系呢?更改一下之前的

publishing {    publications {        aar(MavenPublication) {            groupId packageName            version = libraryVersion            artifactId project.getName()            // Tell maven to prepare the generated "* .aar" file for publishing            artifact("$buildDir/libs/${project.getName()}.jar")            pom.withXml {                def dependencies = asNode().appendNode('dependencies')                configurations.getByName("compile").getResolvedConfiguration().getFirstLevelModuleDependencies().each {                    def dependency = dependencies.appendNode('dependency')                    dependency.appendNode('groupId', it.moduleGroup)                    dependency.appendNode('artifactId', it.moduleName)                    dependency.appendNode('version', it.moduleVersion)                }            }        }    }}

Fourth

这里写图片描述

Fifth

这里写图片描述
执行完之后,你可以看看是否上传成功,服务器上有没有。

Sixth

上传已经做完了,下面就是如何在另一个项目中引入

  • 在根目录build.gradle中

这里写图片描述

Seventh

这里写图片描述
引入成功,快试试你的依赖库吧

后记

就这么点东西,写了几个小时,(╯﹏╰)
markdown的排版不熟呀,写出来的这个排版,我也是醉了

原创粉丝点击