Android内网离线Maven仓库搭建笔记

内网离线Maven仓库笔记

一、初识

  1. 依赖结构

    //示例
    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
    
  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
    
  3. 常用的Maven仓库

    阿里云Maven仓库服务

    Maven中央仓库

二、本地仓库搭建

  1. 准备依赖包

    • 方式一:直接到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路径下
  2. 提取依赖包(针对方式二)

    参考文章: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.shmirro.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 store

    Repository | Repositorie| Create repository ,选择maven2 (hosted)类型

    proxy:如果在此仓库找不到依赖,则去指定的maven地址下载,然后缓存下来

    hosted:没有则报错

    group:多个仓库组成一个,根据自定义的顺序来寻找依赖

    然后name:android,Blob store 选择刚刚创建的android,其他默认即可。

  • 批量上传脚本

    参考:批量上传Maven仓库jar包到Nexus私服

    创建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' }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值