内网离线Maven仓库笔记
一、初识
-
依赖结构
//示例 com.android.tools.build:gradle:4.4.2 //组成 group-Id:artifact-Id:version group-Id:com.android.tools.build artifact-Id:gradle version:4.4.2
-
仓库结构
m2repository -com --android ---tools ----build -----gradle ------4.2.2 -------gradle-4.2.2.jar -------gradle-4.2.2.module -------gradle-4.2.2.pom
-
常用的
Maven
仓库
二、本地仓库搭建
-
准备依赖包
- 方式一:直接到Maven仓库下载,然后自己组成成相应的目录结构
- 方式二:新建一个android项目,在项目
build.gradle
中添加需要的所有依赖,然后找到本地gradle依赖缓存路径
,将依赖按需要的目录格式提取出来; 缓存路径
:打开Settings | Build,Execution,Deployment | Build Tools-Gradle
项,查看Gradle user home
路径,例如路径为:C:/Users/admin/Documents/android/gradle-5.6.4
;则缓存路径
在其gradle-5.6.4/caches/modules-2/files-2.1
路径下
-
提取依赖包(针对方式二)
参考文章:gradle cache⽬录(.gradle)剖析
-
准备
mirror
脚本,将gradle缓存路径下依赖按照maven依赖规范的目录结构进行提取 -
缓存下的目录结构
${org}/${package}/${version}/${shanum1}/${package-version}.pom
${org}/${package}/${version}/${shanum2}/${package-version}.jar
com.android.tools.build -gradle --4.4.2 ---6b6991d32da46b5444ef15a71bd8ecc012524ca8 ----gradle-3.5.0-sources.jar ...
-
maven规范目录结构
-com --android ---tools ----build -----gradle ------4.4.2 -------grdle-3.5.0-sources.jar
-
mirror
脚本,将缓存目录下的所有依赖按照maven规范提取到执行脚本同级的m2repository
目录下#!/bin/bash #use .gradle/caches/modules-2/files-2.1/ to create jcenter SHPATH=$(cd "$(dirname "$0")"; pwd) DIR="${SHPATH}/caches/modules-2/files-2.1/" DIR_LENGTH=${#DIR} if [ `uname` = "Darwin" ]; then #mac will add "/" DIR_LENGTH=$((DIR_LENGTH+1)) fi rm -rf ${SHPATH}/jcenter/* find ${DIR} -type f | grep -Ev "DS_Store" | while read line do SRC=${line} URL=${line:${DIR_LENGTH}} ORG=${URL%%/*} URL=${URL#*/} MODULE=${URL%%/*} URL=${URL#*/} REVISION=${URL%%/*} URL=${URL#*/} SHA1=${URL%%/*} URL=${URL#*/} FILE=${URL} #echo "ORG=$ORG, MODULE=$MODULE, REVISION=$REVISION, SHA1=$SHA1, FILE=$FILE" DST=${SHPATH}/m2repository/${ORG//.//}/${MODULE}/${REVISION}/${FILE} echo "$DST" mkdir -p `dirname ${DST}` if [ ! -f ${DST} ]; then cp -a ${SRC} ${DST} fi done
-
fix_aar_cache
脚本:用于修复mirror
脚本提取遇到aar
没有pom
文件的依赖的问题#!/bin/bash SHPATH=$(cd "$(dirname "$0")"; pwd) SRC_DIR=${SHPATH}/jcenter CACHE_DIR="${SHPATH}/caches/modules-2/files-2.1/" ${SHPATH}/mirror.sh > /dev/null DIR_LENGTH=${#SRC_DIR} if [ `uname` = "Darwin" ]; then #mac will add "/" DIR_LENGTH=$((DIR_LENGTH+1)) fi find ${SRC_DIR} -name "*.aar" | while read line do SRC=${line} LOCAL_POM=${SRC/.aar/.pom} if [ -f ${LOCAL_POM} ]; then continue fi echo "$LOCAL_POM not found" URL=${line:${DIR_LENGTH}} URL=${URL/.aar/.pom} REMOTE_POM=http://maven.aliyun.com/nexus/content/repositories/jcenter/${URL} REMOTE_POM_SHA1=${REMOTE_POM}.sha1 SHA1=`wget -q -O- ${REMOTE_POM_SHA1}` SHA1=${SHA1:2} #remove additional \r\n echo $SHA1 #reverse to get it FILE=${URL##*/} URL=${URL%/*} REVISION=${URL##*/} URL=${URL%/*} MODULE=${URL##*/} URL=${URL%/*} ORG=${URL} echo "ORG=$ORG, MODULE=$MODULE, REVISION=$REVISION, FILE=$FILE" #org /->. DST=${CACHE_DIR}/${ORG//\//\.}/${MODULE}/${REVISION}/${SHA1}/${FILE} echo "$DST" mkdir -p `dirname ${DST}` if [ ! -f ${DST} ]; then wget -O ${DST} ${REMOTE_POM} fi done
-
执行脚本;将
fix_aar_cache.sh
和mirro.sh
脚本放到caches
目录同级下,执行chmod a+x fix_aar_cache.sh && ./fix_arr_cache.sh
-
最终会在同级目录生成
m2repository
目录,里面就是提取的所有依赖
-
三、本地仓库的使用
假设将第二步
的仓库放到E:\\Android\\m2repository
路径,在项目的build.gradle
文件使用:
// buildscript{}是构建项目前,为项目进行前期准备和初始化相关配置依赖的地方
buildscript {
repositories{
maven { url 'E:\\Android\\m2repository' }
}
}
//为所有模块配置使用此本地仓库
allprojects {
repositories {
maven { url 'E:\\Android\\m2repository' }
}
}
四、上传到Nexus私服
假若你在搭建了一个Nexus私服,把本地的maven仓库上传到Nexus上;
-
搭建Nexus(略),测试版本:
3.22.0-02
-
创建一个
android
的maven仓库Repository | Blob Stores | Create blob store
先创建一个blob库,真实存放依赖文件的地方。name
:android,Path
:android ,Create blob storeRepository | Repositorie| Create repository
,选择maven2 (hosted)
类型proxy:如果在此仓库找不到依赖,则去指定的maven地址下载,然后缓存下来
hosted:没有则报错
group:多个仓库组成一个,根据自定义的顺序来寻找依赖
然后
name
:android,Blob store 选择刚刚创建的android
,其他默认即可。 -
批量上传脚本
创建
mavenimport.sh
#!/bin/bash # copy and run this script to the root of the repository #directory containing files # this script attempts to exclude uploading itself #explicitly so the script name is important # Get command line params while getopts ":r:u:p:" opt; do case $opt in r) REPO_URL="$OPTARG" ;; u) USERNAME="$OPTARG" ;; p) PASSWORD="$OPTARG" ;; esac done echo "$USERNAME:$PASSWORD $REPO_URL" find . -type f -not -path './mavenimport\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' | sed "s|^\./||" | xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} ;
-
mavenimport.sh
放到m2repository
根目录下,将m2repository
压缩,把m2repository.zip
压缩包上传到nexus
所在的服务器上。 -
解压
m2repository.zip
unzip -qo m2repository.zip
-
进入
m2repository
目录cd m2repository
-
执行导入命令(将服务器ip改成真实的服务器ip)
chmod a+x mavenimport.sh && ./mavenimport.sh -u admin -p admin -r http://服务器ip:8081/repository/maven-releases/
-
等待上传完成,登录
Nexus
,Browse浏览android 的仓库是否已经有相应的依赖。
五、使用线上的Maven仓库
// buildscript{}是构建项目前,为项目进行前期准备和初始化相关配置依赖的地方
buildscript {
repositories{
maven { url 'http://服务器ip:8281/repository/android' }
}
}
//为所有模块配置使用此本地仓库
allprojects {
repositories {
maven { url 'http://服务器ip:8281/repository/android' }
}
}