背景
1、为什么要创建一个自己的maven仓库?
加快组件下载速度。因网络原因,启动gradle项目从jcenter、maven或google仓库下载组件时,速度会特别慢,整个项目同步过程会特别耗时。将相关的组件上传到自己的maven仓库,再从自己的仓库中拉取,速度会快很多。所以,创建一个自己的maven仓库很有必要。
2、如何创建自己的maven仓库?
一般建一个maven仓库直接使用nexus即可。nexus是maven仓库服务,在自己的服务器上启动nexus即将自己的服务器变成maven仓库。
简单的maven仓库
简单的maven仓库不使用nexus,直接使用nginx做maven服务。为什么nginx可以做maven服务器呢?我们可以看是组件依赖到组件获取的过程即可知晓。
在项目中引用了okhttp3的3.8.0版本组件,maven仓库为https://repo1.maven.org/maven2/,如下
allprojects {
repositories {
mavenCentral()
}
}
dependencies {
implementation 'com.squreup.okhttp3:okhttp:3.8.0'
}
gradle同时即会从https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.8.0/okhttp-3.8.0.jar下载组件,可以看出gradle下载依赖时,根据组件信息组装成对应的下载地址,从maven服务器下载对应的组件。
所以,将组件以这种规则存放到nginx服务器对应的目录,即可将nginx当作maven仓库服务器。
本地gradle缓存生成maven仓库目录
#!/bin/bash
# 对指定目录下的文件排序,只选择最大的一个数据
# srcpath="/home/client/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/"
# files=$(ls $srcpath | sort -n | head -1)
# echo "$files"
# 获取最新版本
function getNewestVersion(){
path=$1
# echo "path:$path"
file=$(ls $path | sort -n | head -1)
echo "$file"
# return file
}
# 获取指定版本目录下的-sources.jar文件
function getSourceJar(){
path=$1
module=$2
version=$3
# echo "hello,world"
# echo "path:$path"
# echo "module:$module"
# echo "version:$version"
for file in $path/*
do
sourceFile="$file/$module-$version-sources.jar"
# echo "$sourceFile"
if [ -f "$sourceFile" ]
then
echo "$sourceFile"
fi
done
}
# 将~/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/3.8.0目录下的文件复制到
# 目标目录下的com/squareup/okhttp3/3.8.0/目录下
function copyArtifacts(){
# echo "copy artifacts: $1"
path=$1
dest=$2
version=${path##*/}
parent=${path%/*}
artifact=${parent##*/}
parent=${parent%/*}
group=${parent##*/}
echo "$artifact:$version"
# echo "version:$version"
# echo "parent:$parent"
# echo "artifact:$artifact"
# echo "gropu:$group"
dir=(${group//.//})
# echo "dir:$dir"
dir="$dest/$dir/$artifact/$version"
# echo "full dir:$dir"
mkdir -p $dir
for file in $path/*
do
cp $file/* $dir
done
}
# version=$(getNewestVersion /home/client/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/)
# echo "version:$version"
# version="3.8.0"
# getSourceJar /home/client/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/3.8.0 okhttp $version
function enumGroups(){
dest=$1
for file in ~/.gradle/caches/modules-2/files-2.1/*
do
if test -f $file
then
echo "file:$file"
else
# echo "dir:$file"
group=${file##*/}
echo "------------------$group------------------"
enumModules $file $dest
fi
done
}
function enumModules(){
path=$1
dest=$2
for file in $path/*
do
# echo $file
module=${file##*/}
version=$(getNewestVersion $file)
# echo "$module"
# echo "version:$version"
# version="3.8.0"
# getSourceJar $file okhttp $version
copyArtifacts $file/$version $dest
done
}
enumGroups ~/Desktop/repo
# enumModules ~/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3 ~/Desktop/repo
# copyArtifacts ~/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/3.8.0 ~/Desktop/repo
组件上传
参考:
1、shell路径分割:https://blog.csdn.net/whatday/article/details/106076384
2、shell字符串替换:https://blog.csdn.net/u010003835/article/details/80750003