构建工具(四):Maven仓库及搭建内网仓库

分析Android项目中的build.gradle中的使用到的不同仓库,以及怎样搭建使用内网Maven私服。

Maven仓库

上几篇文件中,或多或少都讲述了仓库。有了仓库,我们就不用每一个项目中,都存储需要的依赖文件,声明某个存储所有依赖文件的位置,然后去该路径中引入,该文件可以称为Maven仓库。不仅避免了磁盘空间的浪费,而且还更好地管理依赖文件。

仓库可以是本地的,也可以是远程的。下面我们就分析Android项目中的build.gradle中的关于仓库的声明,下面列出开发中遇到的所有仓库,不一定全部都会使用到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
repositories {
// 远程仓库
google()
jcenter()
mavenCentral()
// 自定义远程仓库
maven {
url "http://maven.aliyun.com/nexus/content/groups/publict"
}
// 本地仓库
mavenLocal()
maven{
// 应用Android Studio包内的仓库地址(Mac)
url "/Applications/Android Studio.app/Contents/gradle/m2repository"
// 应用Android Studio包内的仓库地址(Window),该路径取决放Android Studio安装包的路径。
// 注意,直接复制window的路径后该改反斜杠为如下的'/'
url "D:/Program Files/Android/android-studio/gradle/m2repository"
}
// 内网的私有仓库
maven{
url “http://localhost:8081/repository/testRepository/”
}
}

仓库介绍

远程中央仓库

  • mavenCentral是最早的maven中央仓库,Maven仓库网站,可以通过Maven仓库引用地址看到全部内容。
  • jcenter是Anroid Studio 0.8版本起的默认maven中央仓库,jcenter仓库网站,可以通过jcenter仓库引用地址看到全部内容。
  • google是Android Studio 3.0版本起添加的仓库,google把gralde插件、tools、support、design等依赖文件放在其中,可以通过google仓库引用地址看到全部内容。
  • 自定义远程仓库,如果觉得上面的仓库慢,可以使用阿里云的仓库。或者自己在内网搭建私有仓库,也可以这样声明。

本地仓库

  • mavenLocal是默认本地仓库,仓库位置在前面的Maven介绍及安装有介绍到,Mac默认为${user.home}/.m2/repository。PC默认为C:\Users\用户名\.m2\repository
  • 自定义本地仓库地址:如果本地的其他路径下,也有存放依赖文件,可以在这里声明该路径下的仓库地址。上面举例声明了Android Studio包内的仓库,用命令行编译代码的时候,如要加载Android Studio包的tool文件夹内的独有依赖包,就可以声明该仓库。

搭建内网Maven私服

安装配置Nexus

  • 在maven仓库管理器Sonatype Nexus官网中,选择Products–>NEXUS REPOSITORY OSS(免费)下载

    我下载的版本为,Nexus Repository Manager OSS 3.x - OS X,解压存放在本地中

    1
    2
    ➜  nexus-3.10.0-04-mac pwd
    /Users/guidongyuan/Applications/nexus-3.10.0-04-mac
  • nexus-3.10.0-04的bin文件设置环境变量

    1
    2
    export NEXUS=/Users/guidongyuan/Applications/nexus-3.10.0-04-mac/nexus-3.10.0-04
    export PATH=$PATH:$NEXUS/bin
  • 查看Java版本

    Nexus Repository Manager需要Java的运行环境,目前nexue 3需要JDK 1.8,如果有多个不同版本的JDK,且默认不是1.8,需要指定特定的JDK安装路径。

    修改bin/nexus脚本并找到该行INSTALL4J_JAVA_HOME_OVERRIDE,设置JDK的路径。

  • 运行启动nexus

    运行的时候,提示找不到org.apache.felix.framework,最后才发现,用解压工具,解压出来的文件名变了!变了!变了!org.apache.felix.framework-5.6.2.jar变成了org.apache.felix.framework-,能不能这么坑!

    1
    2
    ➜  ~ nexus run
    Could not resolve mvn:org.apache.felix/org.apache.felix.framework/5.6.2

    老老实实用命令行解压,再执行就可以了,终端出现这个,则可以表示启动成功

    1
    Started Sonatype Nexus OSS 3.10.0-04
  • 查看仓库网站

    启动成功后,在本地访问localhost:8081,可以看到如下

    默认的用户账号为admin,密码为admin123

  • 终端结束运行的Nexus

    通过Ctrl + C可以结束

Nexus仓库介绍

  • Blob Stores:仓库存储库,设置了依赖库的存储地址,默认名称为default,位置为/Users/guidongyuan/Applications/nexus-3.10.0-04-mac/sonatype-work/nexus3/blobs/default

  • Repositories:仓库列表

    component name

    • maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取依赖包
    • maven-releases:私库正式发行版依赖包
    • maven-snapshots:私库快照(调试版本)依赖包
    • maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,可以点击进去添加或者删除仓库,这样就不需要在pom文件中配置多个地址,一个就够了。

    component type

    • hosted:宿主仓库,存放我们自己项目生成的库
    • 3rd party:第三方依赖的仓库,这个仓库内容通常是由内部人员自行下载之后发布上去
    • proxy:远程仓库的代理,如果在本地找不到,则会从远程中央仓库中下载,再返回给用户,起到中转下载的作用。

具体介绍,可以参考官网Nexus教程或者搭建局域网Maven私服并结合Android Studio实现代码复用

生成AAR文件

创建了内网的Maven仓库,就可以把一些功能模块上传上去。这里使用aar包作为讲解,不知道怎样生成的,可以参考如下:

上传依赖包

手动上传
  • 点击Upload,选择一个仓库

  • 添加依赖包的信息

gradle上传

一两个依赖包上传还好,但是,如果多个,不可能这样手动上传,这个时候,就可以通过编写gralde进行上传。

build.grald文件中,编写一个上传的task。

1
2
3
4
5
6
7
8
9
10
11
apply plugin: 'maven'
uploadArchives {
repositories.mavenDeployer {
pom.groupId = GROUP
pom.artifactId = ARTIFACTID
pom.version = VERSION
repository(url: NEXUS_URL) {
authentication(userName: USER_NAME, password: USER_PASSWORD)
}
}
}

属性变量可以放在同个目录下的gradle.properties中,没有则需要自行创建。

1
2
3
4
5
6
GROUP = com.guidongyuan.studytest
ARTIFACTID = testandroidlibrary
VERSION = 1.0.0
NEXUS_URL = http://localhost:8081/repository/testRepository/
USER_NAME = admin
USER_PASSWORD = admin123

然后,在终端中,执行./gradlew uploadArchives就可以上传。

另外也可以创建一个gradle文件如gradle_push.gradle编写task任务,不过需要在build.grald文件中,进行引用。

1
apply from: "./gradle_push.gradle"

上传完成后,可以在nexus中查找到。

引用

上传到仓库后,引用的时候,就可以直接定义仓库和依赖库

1
2
3
maven {
url "http://localhost:8081/repository/testRepository/"
}
1
compile 'com.guidongyuan.studytest:testandroidlibrary:1.0.0'

参考链接

公众号:亦袁非猿

欢迎关注,交流学习