Maven私有仓库搭建
Aug 6, 2016
前言
在Android开发的世界中,依赖管理是每个开发人员不得不面对的问题,无论是外部的开源类库依赖,还是项目内部的模块间的依赖,都需要有效的管理。在Android中不仅可以依赖module
、so
、jar
还可以依赖aar
。既可引用远程仓库jcenter()
、mavenCentral()
、也可以引用私有仓库、本地仓库。使用Maven可以有效地解决依赖管理。
Maven包
使用方式
1
2
3dependencies {
compile 'cn.sharesdk.onekeyshare:onekeyshare:1.0.0'
}包结构
POM文件,包含maven包的相关信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.sharesdk.onekeyshare</groupId>
<artifactId>onekeyshare</artifactId>
<version>1.0.0</version>
<packaging>aar</packaging>
<name>Onekeyshare Aar Repository</name>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<id>troy</id>
<name>troy</name>
</developer>
</developers>
</project>
Maven 仓库
Maven仓库用于存放Maven包,可以是本地的,远程的、私有的、公开的。
1 | repositories { |
使用Nexus搭建私有仓库
下载nexus,选择
nexus-3.0.1-01-mac.tgz
解压文件,进入
nexus-3.0.1-01/bin
目录,输入./nexus start
运行服务,nexus默认监听端口8081。浏览器中访问
http://your ip:8081
nexus管理员主界面,默认帐号
admin
,密码admin123
仓库类型
hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
发布包到私有仓库
使用方法参考chrisbanes/gradle-mvn-push 插件
在项目根目录新建
gradle.properties
文件使用如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31# 项目名称
PROJ_NAME=onekeyshare
PROJ_ARTIFACTID=onekeyshare
PROJ_POM_NAME=Onekeyshare Aar Repository
POM_PACKAGING=aar
# the following can move to ~/.gradle/gradle.properties
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
RELEASE_REPOSITORY_URL=http://172.16.1.19:8081/repository/maven-releases/
SNAPSHOT_REPOSITORY_URL=http://172.16.1.19:8081/repository/maven-snapshots/
# 包信息
PROJ_GROUP=cn.sharesdk.onekeyshare
PROJ_VERSION=1.0.0
# 项目的描述
#PROJ_WEBSITEURL=
#PROJ_ISSUETRACKERURL=
#PROJ_VCSURL=
#PROJ_DESCRIPTION=Simple and effective bug & crash reporting tool for Android apps
# Licence信息
PROJ_LICENCE_NAME=The Apache Software License, Version 2.0
PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
PROJ_LICENCE_DEST=repo
# Developer 信息
DEVELOPER_ID=troy
DEVELOPER_NAME=troy
DEVELOPER_EMAIL=chenlongfeiceo@gmail.com根目录下新建
gradle-mvn-push.gradle
文件使用如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100apply plugin: 'maven'
apply plugin: 'signing'
def isReleaseBuild() {
return PROJ_VERSION.contains("SNAPSHOT") == false
}
def getReleaseRepositoryUrl() {
return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}
def getSnapshotRepositoryUrl() {
return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
: "https://oss.sonatype.org/content/repositories/snapshots/"
}
def getRepositoryUsername() {
return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME
: ""
}
def getRepositoryPassword() {
return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD
: ""
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.groupId = PROJ_GROUP
pom.artifactId = PROJ_ARTIFACTID
pom.version = PROJ_VERSION
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
snapshotRepository(url: getSnapshotRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
pom.project {
name PROJ_POM_NAME
packaging POM_PACKAGING
// description PROJ_DESCRIPTION
// url PROJ_WEBSITEURL
scm {
// url PROJ_VCSURL
connection DEVELOPER_EMAIL
developerConnection DEVELOPER_EMAIL
}
licenses {
license {
name PROJ_LICENCE_NAME
url PROJ_LICENCE_URL
distribution PROJ_LICENCE_DEST
}
}
developers {
developer {
id DEVELOPER_ID
name DEVELOPER_NAME
}
}
}
}
}
}
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}在
build.gradle
中使用插件1
apply from: '../gradle-mvn-push.gradle'
执行gradle task进行上传操作
1
$ ./gradlew clean build uploadArchives
查看已上传的maven包
使用maven包
- 声明私有仓库地址
1
2maven { url "http://172.16.1.19:8081/repository/maven-releases/" }
- 使用maven包
1
2
3dependencies {
compile 'cn.sharesdk.onekeyshare:onekeyshare:1.0.0'
}