Android开发中用到maven或者jcenter是再常见不过的事情了,但是如果自己有库项目想要发布到仓库中去用,而又不想让别人看到,这时候就不能简单的发布到上面两个公共仓库里去了,而是需要自己搭建一个私有的仓库。

一、安装

这个需要用到jfrog提供的开源的工具Artifactory安装点这里

我的机器是mac,我选择的是以手动的方式在本机安装

二、配置

用不了多长时间就可以安装完,启动后访问Artifactory的web页面,因为我是本地搭的,所以地址为http://localhost:8081/artifactory/,如下所示:

jfrog-artifactory-startup

  1. 默认管理员登录和修改密码
    • 点击登录,用默认用户名:admin密码:password登录上去
  • 找到 Admin -> Security -> Users -> admin 可以把默认密码修改掉
  1. 创建用户组和权限
    • Admin -> Security -> Groups 点击右上角新建按钮:

jfrog-artifactory-group

  • 创建好一个deployer后可以在 Admin -> Security -> Permissions 新建发布用权限deployment,并将前两个Repository勾选,然后下一步:

jfrog-artifactory-permission1

  • 双击左侧列表中刚刚新建的用户组deployer,将其加入此权限范围,并勾选除去管理之外的所有权限,并点击完成

jfrog-artifactory-permission2

  1. 创建用户
    • Admin -> Security -> Users -> New,并填入必填项用户名、密码、邮箱等

jfrog-artifactory-newuser1

  • 确保所属用户组只有刚刚新建的deployer,然后能看到对应的权限已分配给此用户,最后点击完成

jfrog-artifactory-newuser2

  1. 退出登录,用刚刚创建好的账号登录进来,点击用户名进入用户信息页,输入刚刚设置的密码,解锁设置,然后找到加密的密码项,复制下来,一会儿会用到

jfrog-artifactory-encryptedpwd

三、发布

  • 在根目录下的gradle.properties文件中添加内容,ARTIFACT_USERPWD对应内容就是上面的加密密码
ARTIFACT_USERNAME=someone
ARTIFACT_USERPWD=AP8BCNnrXXXvoRyKRpVTyhzV3po
  • 在根目录下的build.gradle中添加classpath
buildscript {
    dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1"
    }
}
  • 在要发布的项目目录下的build.gradle中添加插件
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
  • build.gradle中添加发布配置
def libVersion = '1.0'		// version
def libGroupId = 'pub.fury.somelib'		// GroupId
def libArtifactId = project.getName()	// ArtifactId
publishing {
	publications {
		aar(MavenPublication) {
			groupId libGroupId
			version libVersion
			artifactId libArtifactId
			artifact("$buildDir/outputs/aar/${project.getName()}-release.aar") // 产出物路径
			// 将lib中的gradle形式的依赖全部添加到pom中去
			// 这样在依赖此库的项目里面就不用再写一遍了,会自动下载对应依赖
			pom.withXml {	
				def dependencies = asNode().appendNode('dependencies')
				configurations.getByName("_releaseCompile").getResolvedConfiguration().getFirstLevelModuleDependencies().each {
					def dependency = dependencies.appendNode('dependency')
					dependency.appendNode('groupId', it.moduleGroup)
					dependency.appendNode('artifactId', it.moduleName)
					dependency.appendNode('version', it.moduleVersion)
				}
			}
		}
	}
}
  • build.gradle中添加上传到artifactory仓库的配置
artifactory {
	// contextUrl 对应仓库地址
	contextUrl = 'http://localhost:8081/artifactory'
	publish {
		repository {
			// repoKey 对应仓库中的repository
			repoKey = 'libs-release-local'
			// 之前有在gradle.properties中配置下两项内容
			username = ARTIFACT_USERNAME
			password = ARTIFACT_USERPWD
		}
		defaults {
			publications('aar')
			publishArtifacts = true
			properties = ['qa.level': 'basic', 'dev.team': 'core']
			publishPom = true
		}
	}
}
  • 最后执行构建和发布
$ ./gradlew clean assembleRelease artifactoryPublish
  • 可在仓库中查看到刚刚发布的Artifacts

jfrog-artifactory-artifacts

四、依赖

至于如何使用刚刚发布的库,则更简单:

  • 首先在项目根目录下的build.gradle中添加私有仓库地址
allprojects {
    repositories {
		 // 之前用的什么仓库还继续保留,不过加上这个maven的配置就行
        maven{
            credentials {
                // 这里可以是只读的用户身份,依然是配置到gradle.properties中
                username ARTIFACT_USERNAME
                password ARTIFACT_USERPWD
            }
            url "http://localhost:8081/artifactory/libs-release-local"
        }
    }
}
  • 在需要此库项目的build.gradle中添加依赖
compile 'pub.fury.somelib:library:1.0'
  • 如果不需要限制用户身份,任何人可读的话,管理员设置匿名可用就可以了:

jfrog-artifactory-anonymous

五、实例

https://github.com/zhangzhenxi/SomeLib