批量导入Maven的本地库目录到Nexus的脚本解析

Nexus如何导入jar以及批量导入Maven的本地库目录 这一篇中介绍了如何使用脚本批量将Maven本地库目录的所有依赖导入到Nexus私有服务器。 有很多同学反应对于脚本内容有点看不明白,本篇就对批量导入的脚本做一个解析。

脚本回顾

#!/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

find . -type f -not -path './mvnimport\.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}/{} ;

脚本解析-section1

这是一个B Shell脚本, 在Linux下可以直接执行, Windows 下可以借助Git Bash执行。

  • 前四行以井号 (#)开头, 属于注释的内容
  • getopts ":r:u:p:" opt 是获取命令行的选项的值
  • ":r:u:p:" 第一个冒号意思是当命令行出现optstring 中没有的参数不会提示错误, 选项名后面的冒号表示这个选项会传入值, 比如 r: ,则在命令行中选项的设置是 -r rvalue
  • while done 是Shell 脚本的循环
  • case in esac 是Shell 脚本的分支
  • 获取的选项的值会放入 $OPTARG 中“
while getopts ":r:u:p:" opt; do
   case $opt in
   	r) REPO_URL="$OPTARG"
   	;;
   	u) USERNAME="$OPTARG"
   	;;
   	p) PASSWORD="$OPTARG"
   	;;
   esac
done

综合来看,上面的脚本的意思是:
获取命令行中的三个选项r u p 的值 ,看一下命令行调用时传递选项值的方式就清晰了
-u admin -p yourpassword -r http://localhost:8081/repository/maven-releases/
也就是分别获取Nexus的库地址, 用户名和密码, 分别放入 REPO_URL,USERNAME 和 PASSWORD 变量中。

脚本解析-section2

find . -type f -not -path './mvnimport\.sh*' -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml'

find 命令查找当前目录下(包括子目录)符合指定条件的文件列表。这个命令会过滤掉隐藏文件、以 . 开头的文件以及一些指定的特定文件。

以下是该命令中各部分的含义:

.: 指定在当前目录中查找。
-type f: 表示只查找普通文件,而不包括目录和其他特殊文件。
-not -path ‘./mavenimport.sh*’: 表示不匹配名为 “mavenimport.sh” 的任何文件或目录,该部分使用 -not 和 -path 来排除文件名为 “mavenimport.sh” 的任何文件或目录。
-not -path ‘/.’: 表示不匹配以 “.” 开头的隐藏文件。该部分使用 -not 和 -path 排除任何以斜杠为开头并紧随一个句点(如"/.git")的文件路径。
-not -path ‘/^archetype-catalog.xml’: 表示不匹配名为 “archetype-catalog.xml” 的任何文件或目录。该部分使用 -not 和 -path 目的是排除文件名为 “archetype-catalog.xml” 的任何文件或目录。
-not -path ‘/^maven-metadata-local.xml’: 表示不匹配名为 “maven-metadata-local.xml” 的任何文件或目录。该部分使用 -not 和 -path 目的是排除文件名为 “maven-metadata-local.xml” 的任何文件或目录。
-not -path ‘/^maven-metadata-deployment.xml’: 表示不匹配名为 “maven-metadata-deployment.xml” 的任何文件或目录。该部分使用 -not 和 -path 目的是排除文件名为 “maven-metadata-deployment.xml” 的任何文件或目录。
总之,该命令将查找不在当前目录中以 “.” 开头的隐藏文件和一些特定文件之外的所有普通文件。

脚本解析-section3

| sed "s|^\./||" 
  • 竖线 | 是管道命名, 将前一个命令的输出作为后一个命令的输入
    这里的sed 命令,用于删除路径名前缀中的 “./”。它适用于以文件列表形式输出或处理当前目录下的文件。

在这个命令中,sed 是用于文本替换的工具,s 表示替换操作的开始,| 表示分隔符,它包围替换操作的所有部分。每个命令行都以 | 结束。例如,^./ 表示从开头查找将要替换的文本,即 ./,并删除它。

所以,如果有一个文件列表,文件名前面都加有相对路径 ./,使用以下命令可以删除所有文件名前的 ./ 路径名前缀:

Copy code

sed “s|^./||” 文件列表
这将输出不带路径名前缀的文件名列表。

./antlr/antlr/2.7.2/antlr-2.7.2.jar
=》
antlr/antlr/2.7.2/antlr-2.7.2.jar

脚本解析-section4

| xargs -I '{}' curl -u "$USERNAME:$PASSWORD" -X PUT -v -T {} ${REPO_URL}/{} 

这是一个 curl 命令,用于将多个本地文件上传到远程仓库。该命令还使用 xargs 命令来将输出作为 curl 命令的参数。

以下是该命令中各部分的含义:

xargs -I ‘{}’: 将前面一个命令的输出作为后面命令的参数,-I ‘{}’ 指定占位符。
curl: 用于发送 HTTP 请求。
-u “ U S E R N A M E : USERNAME: USERNAME:PASSWORD”: 指定身份验证凭据,其中 $USERNAME 和 $PASSWORD 是变量,用于保存用户名和密码。
-X PUT: 指定 HTTP 请求方法为 PUT,用于上传文件到远程仓库。
-v: 启用详细模式,可以查看命令发送和接收的请求和响应的详细信息。
-T {}: 指定上传文件的路径,{} 作为占位符,由 xargs 命令替换为实际文件路径。
R E P O U R L / : 指定上传文件的远程仓库 U R L 路径, {REPO_URL}/{}: 指定上传文件的远程仓库 URL 路径, REPOURL/:指定上传文件的远程仓库URL路径,{REPO_URL} 是变量,存储仓库的 URL。
综上,该命令将在当前目录中查找所有文件,并使用 curl 命令将文件上传到指定的远程仓库路径中。上传时使用指定的用户名和密码进行身份验证,直到所有文件都被上传为止。



猜你喜欢

转载自blog.csdn.net/oscar999/article/details/131446832