写在前面
并不是什么高端的东西,大神请忽略,不会的请看这里。可能实际的用处并不是很大,但是你学会了,就可以在不会的人面前装一把,哈哈!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的排版不熟呀,写出来的这个排版,我也是醉了