maven私服
Maven 仓库优先级
本地仓库 >profile > pom中的repository > mirror
仓库
本地仓库
路径 ${M2_HOME}/conf/settings.xml
<!-- 默认的值是${user.home}/.m2/repository -->
<localRepository>D:\maven\aliyun-repository</localRepository>
中央仓库
Maven必须要知道至少一个可用的远程仓库,中央仓库就是这样一个默认的远程仓库,Maven 默认有一个 super pom 文件。
maven super pom 文件位置,,例如:D:\apache-maven-3.0.4\lib 下的 maven-model-builder-3.0.4.jar 中的 org/apache/maven/model/pom-4.0.0.xml
··· 省略其他
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
···
这个时候我们就明白了,我们在 settings 文件配置一个 mirror 的 mirrorOf 为 central 的镜像就会替代 ‘中央仓库’
Maven镜像
常用的阿里云镜像仓库:https://developer.aliyun.com/mvn/guide
镜像(Mirroring)是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。
为什么配置镜像?
- 1.一句话,你有的我也有,你没有的我也有。(拥有远程仓库的所有 jar,包括远程仓库没有的 jar)
- 2.还是一句话,我跑的比你快。(有时候远程仓库获取 jar 的速度可能比镜像慢,这也是为什么我们一般要配置中央仓库的原因,外国的 maven 仓库一般获取速度比较慢)
如果你配置 maven 镜像不是为了以上两点,那基本就不用配置镜像了。
注意: 当远程仓库被镜像匹配到的,则在获取 jar 包将从镜像仓库获取,而不是我们配置的 repository 仓库, repository 将失去作用
mirrorOf 标签
mirrorOf 标签里面放置的是 repository 配置的 id,为了满足一些复杂的需求,Maven还支持更高级的镜像配置:
external:* = 不在本地仓库的文件才从该镜像获取
repo,repo1 = 远程仓库 repo 和 repo1 从该镜像获取
*,!repo1 = 所有远程仓库都从该镜像获取,除 repo1 远程仓库以外
* = 所用远程仓库都从该镜像获取
私有仓库
私服(私有仓库)是一种特殊的远程Maven仓库,它是架设在局域网内的仓库服务,私服一般被配置为互联网远程仓库的镜像,供局域网内的Maven用户使用。
当Maven需要下载构件的时候,先向私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,同时缓存在私服之上,然后为Maven下载请求提供下载服务,另外,对于自定义或第三方的jar可以从本地上传到私服,供局域网内其他maven用户使用。
优点主要有:
- 节省外网宽带
- 加速Maven构建
- 部署第三方构件:可以将公司项目的 jar 发布到私服上,方便项目与项目之间的调用
- 提高稳定性、增强控制:原因是外网不稳定
- 降低中央仓库的负荷:原因是中央仓库访问量太大
配置
所有可以配置位置如下
- pom.xml 的
repository - pom.xml 中
profile的repository - settings.xml 的
mirror - settings.xml 中
profile的repository
排除镜像代理
*的情况,优先级如下本地仓库(local repository) -> 私服(setting.xml-profile) -> 远程仓库(pom.xml-repository) 和 镜像(setting.xml-mirror)
镜像是一个特殊的配置,其实镜像等同于远程仓库,没有匹配远程仓库的镜像就毫无作用
更改配置不生效的话,重启Idea。
配置一 setting.xml的配置为 *
maven中setting.xml的不能配置为 *, 否则其他所有配置都没用了,代理了所有,都默认走这个url下载。即优先级最高,一般不这么干,除非你就是想所有都走阿里云镜像下载。个人可以,公司不建议这种配置哈,太粗鲁。
示例如下:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf> // 注意这种情况太暴力,其他配置啥也废了。
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
详细注释版本
<mirrors>
<!-- 配置多个mirror,当mirrorOf的值相同时,当且仅当上一个远程仓库连接失败才会访问下一个远程仓库,
连接成功后,即使没有获取想要的jar包,也不会访问下一个远程仓库,故一般配置一个就好,若担心配置的这个镜像会连接失败,可以在加一个
-->
<mirror>
<!-- 唯一标识一个mirror -->
<id>aliyun-maven-mirror</id>
<!-- 指定该镜像代替的时那个仓库,例如central就表示代替官方的中央库,*表示所有仓库都是用该镜像,!表示该仓库除外
<mirrorOf>*,!central</mirrorOf> 表示所有的远程仓库 central除外,都使用该阿里云镜像
-->
<mirrorOf>central</mirrorOf>
<!-- 该镜像库的名称,并无特殊用处 -->
<name>aliyun Maven</name>
<!-- 代理镜像库的地址 -->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
配置二 pom.xml配置多个repository
setting.xml没有配置mirror和profile,默认的;pom.xml配置多个repository
| mirror | profile | pom |
|---|---|---|
| 无 | 无 | repository1 - aliyun-public1 |
| repository2 - aliyun-public2 |
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- 图片处理 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.14</version>
</dependency>
</dependencies>
......
<repositories>
<!-- https://developer.aliyun.com/mvn/guide -->
<repository>
<id>aliyun-public1</id>
<url>https://maven1.aliyun.com/repository/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>aliyun-public2</id>
<url>https://maven.aliyun.com/repository/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
结果
先尝试从 仓库1 下载,下载失败;从仓库2下载,下载成功。
结论:
- pom.xml中配置多个repository,会按照配置的先后顺序从repository1、repository2(repository1中找不到的情况下才会从repository2下载)下载依赖jar。
配置三 配置下载jar、源码等先走私服,找不到再走阿里云镜像
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<localRepository>C:/repository</localRepository>
<servers>
<!-- 私服用户名密码 注意id与下面 profile.repository.id 对应 -->
<server>
<id>lakernexus</id>
<username>laker</username>
<password>laker123</password>
</server>
</servers>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf> <!-- 只代理central中央仓库镜像-->
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<!-- 定义profile注意下面激活的时候使用-->
<id>lakerProfile</id>
<repositories>
<repository>
<!-- server.id对应-->
<id>lakernexus</id>
<url>https://lakernexus.com/repository/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>lakernexus</id>
<url>https://lakernexus.com/repository/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<!-- 定义profile注意下面激活的时候使用-->
<activeProfile>lakerProfile</activeProfile>
</activeProfiles>
</settings>
配置四 setting.xml配置多个profile.repository
<profiles>
<profile>
<id>maven-aliyun</id>
<repositories>
<repository>
<id>aliyun-public</id>
<name>aliyun public</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
<repository>
<id>aliyun-public</id>
<name>aliyun public</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
</profile>
</profiles>
<!-- 激活profile -->
<activeProfiles>
<!-- activeProfile的属性值就是上面profiles列表种profile的id,若不存在则忽视 -->
<activeProfile>maven-aliyun</activeProfile>
<activeProfile>maven-nexus</activeProfile>
</activeProfiles>
查看生效配置
1.选中项目=>右键=>Run Maven=>New Goal
2.输入
help:effective-settings,点击运行,控制台会输出合并、覆盖之后最终的settings.xml文件。3.输入
help:active-profiles,点击运行,控制台会输出生效的profiles;Idea工具Maven窗口会直接显示profiles生效情况。settings.xml全局搜索下,防止乱覆盖。
结论
优先级可以认为是如下:
本地仓库 >profile > pom中的repository > mirror
Docker搭建Maven私服
安装Nexus
在远程主机运行一下命令:
docker pull sonatype/nexus3
继续执行:
# 挂载准备工作 [sonatype/nexus3](https://hub.docker.com/r/sonatype/nexus3)
mkdir /data/docker/nexus/data && chown -R 200 /data/docker/nexus/data
mkdir /data/docker/nexus/vdata && chown -R 200 /data/docker/nexus/vdata
docker run -p 21000:8081 --name nexus --network iccs --restart=always -e NEXUS_CONTEXT=nexus -e TZ=Asia/Shanghai -e INSTALL4J_ADD_VM_PARAMS="-Xms1024m -Xmx1024m -XX:MaxDirectMemorySize=1024m" -v /data/docker/nexus/vdata:/var/nexus-data -v /data/docker/nexus/data:/nexus-data -d sonatype/nexus3
访问:http://ip:21000/nexus
账号: admin
密码: 在容器中/nexus-data/admin.password中查看
管理仓库
browse可以查看当前有哪些仓库,搭建好的nexus仓库,默认会带一些仓库,一般这些就够用了
默认仓库说明
maven-central:maven中央库,默认从 https://repo1.maven.org/maven2/ 拉取jar
maven-releases:私库发行版jar,初次安装请将Deployment policy设置为Allow redeploy
maven-snapshots:私库快照(调试版本)jar
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml或项目pom.xml中使用
仓库类型
Group:这是一个仓库聚合的概念,用户仓库地址选择Group的地址,即可访问Group中配置的,用于方便开发人员自己设定的仓库。maven-public就是一个Group类型的仓库,内部设置了多个仓库,访问顺序取决于配置顺序,3.x默认Releases,Snapshots, Central,当然你也可以自己设置。
Hosted:私有仓库,内部项目的发布仓库,专门用来存储我们自己生成的jar文件
3rd party:未发布到公网的第三方jar (3.x去除了)
Snapshots:本地项目的快照仓库
Releases: 本地项目发布的正式版本
Proxy:代理类型,从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的Configuration页签下Remote Storage属性的值即被代理的远程仓库的路径),如可配置阿里云maven仓库
Central:中央仓库
Apache Snapshots:Apache专用快照仓库(3.x去除了)
创建仓库
一般使用默认提供的仓库就行了,这里演示下创建仓库
Configuration->Repository->Repositories->Create repository
选择自己想要的仓库类型
代理仓库设置
这里使用使用阿里云的仓库
地址:http://maven.aliyun.com/nexus/content/groups/public
cache(maximum metadata age) 设置为200天(28800)
私有仓库设置
参数说明
版本策略(Version Policy):
Releases: 一般是已经发布的Jar包
Snapshot: 未发布的版本
Mixed:混合的
布局策略(Layout Policy):
Strict:严格
Permissive:宽松
部署策略(Deployment Policy):
Allow Redeploy:允许重新部署
Disable Redeploy:禁止重新部署
Read-Only:只读
网络代理
如果部署的机器是通过代理访问的网络,那这里需要设置下代理
Configuration->System->HTTP
这里以使用squid代理上网为例
批量导入本地仓库
创建账号
在 Configuration->Security->Users->Create local User 创建用户 zhangsan/zhangsan123,并分配角色 nx-admin
准备仓库
创建新仓库 maven-local, 其地址为 http://172.18.11.3:21000/nexus/repository/maven-local/
编写脚本
全量导入脚本
创建脚本 full_import.sh, 并将其保存到本地仓库根路径下,如 D:\Software\apache-maven-3.6.3\repository
full_import.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
touch import.txt
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}/{} ;
# find /home -mtime -2 在/home下查最近两天内改动过的文件
# find /home -atime -1 查1天之内被存取过的文件
# find /home -mmin +60 在/home下查60分钟前改动过的文件
# find /home -amin +30 查最近30分钟前被存取过的文件
# find /home -newer tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录
# find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录
# find /home -used -2 列出文件或目录被改动过之后,在2日内被存取过的文件或目录
# 使用方法 在 Git Bash 界面执行如下指令:
# ./full_import.sh -u admin -p admin123 -r http://你的ip:你的端口/repository/my repo/
# ./full_import.sh -u zhangsan -p zhangsan123 -r http://172.18.11.3:21000/nexus/repository/maven-local/
增量导入脚本
创建脚本 incremental_import.sh, 并将其保存到本地仓库根路径下,如 D:\Software\apache-maven-3.6.3\repository
incremental_import.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
echo -e $(date +"%Y-%m-%d %H:%M:%S"): "start import repositories \n" >> import.txt
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 -newer import.txt -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}/{} ;
echo -e $(date +"%Y-%m-%d %H:%M:%S"): "end import successfully \n" >> import.txt
# find /home -mtime -2 在/home下查最近两天内改动过的文件
# find /home -atime -1 查1天之内被存取过的文件
# find /home -mmin +60 在/home下查60分钟前改动过的文件
# find /home -amin +30 查最近30分钟前被存取过的文件
# find /home -newer tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录
# find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录
# find /home -used -2 列出文件或目录被改动过之后,在2日内被存取过的文件或目录
# 使用方法 在 Git Bash 界面执行如下指令:
# ./incremental_import.sh -u admin -p admin123 -r http://你的ip:你的端口/repository/my repo/
# ./incremental_import.sh -u zhangsan -p zhangsan123 -r http://172.18.11.3:21000/nexus/repository/maven-local/
批量导入
前提:windows执行shell脚本,务必安装git 客户端工具。
使用 Git 命令行工具,进入本地仓库根路径,执行如下脚本:
# ./mavenimport.sh -u admin -p admin123 -r http://ip:port/repository/my_repo/
./mavenimport.sh -u zhangsan -p zhangsan123 -r http://172.18.11.3:21000/nexus/repository/maven-local/
## 或者
./incremental_import.sh -u zhangsan -p zhangsan123 -r http://172.18.11.3:21000/nexus/repository/maven-local/
批量下载到本地仓库
编写脚本
创建脚本 full_download.sh, 并将其保存到 D 盘根目录
full_download.sh 脚本内容:
#!/bin/bash
# date:2021/1/4
# author:Javen
# description:通过指定NEXUS的Group下载地址下载指定Group上面的全部jar
# 浏览器上看到的html下载页面的地址
# 脚本支持指哪打哪下载目录的能力,例如只需要下载com.alibaba 包下面的文件,就修改浏览器html地址为下面的地址
# NEXUS_GROUP_BROWSE=http://nexus:8081/service/rest/repository/browse/your-group/com/alibaba/
# NEXUS_GROUP_BROWSE=http://nexus:8081/service/rest/repository/browse/your-group/
NEXUS_GROUP_BROWSE=https://devops-nexus.sany.com.cn/service/rest/repository/browse/iccs-release/com/hxzj/
# 工程里面配置的私服下载地址,这个主要是为了计算出字符串长度,后面创建目录的时候剪切URL前缀用
# NEXUS_GROUP_DOWNLOAD=http://nexus:8081/repository/your-group/
NEXUS_GROUP_DOWNLOAD=http://172.18.11.3:21000/nexus/repository/maven-local/
# 这里加1是为了在后面创建目录的时候,剪切掉目录前面的“/”,不然mkdir的时候会认为是根目录,没有权限创建文件夹
LENGTH=`expr ${#NEXUS_GROUP_DOWNLOAD} + 1`
#echo $LENGTH;
#exit;
#下载jar
function downloadJar() {
#输入jar的url
#curl -sO $1
#私服是否可以匿名访问,如果不可以匿名访问,加密码 curl -u username:passwd -sO $1
printLog "下载jar: "$1
mkdirJarDir $1
curl -sO $1
local p=`echo $1 | sed 's/.jar/.pom/'`
# printLog "下载pom: "$p
curl -sO $p
cd - >&1 >/dev/null
}
#判断是否最后一级目录,如果包含jar文件就认为是最后一级目录
function isLastDir(){
printLog "判断是否最后一级目录 $1"
local boolLastDir=`echo $1 | egrep 'jar$|jar.sha1|pom|pom.sha1'`
# local boolLastDir=`echo $1 | egrep 'jar$|pom'`
if [ -z $boolLastDir ]; then
printLog "不是最后一级目录";
#sleep 2
return 10;
else
printLog "是最后一级目录";
#sleep 2
return 0;
fi
}
#日志打印
function printLog() {
echo $1 | tee -a javen.log
}
#在执行下载方法的时候为jar包创建文件存储路径
function mkdirJarDir() {
printLog "为jar包创建合适的存储路径 $1"
jarDir=`dirname $1|cut -b$LENGTH-200`;
printLog $jarDir
mkdir -p $jarDir;
cd $jarDir
}
#递归进行下载
function downList() {
for var in `curl -s $1 |grep '<a href'|grep -v 'Parent'| sed 's#<a \([^>]*\)>#--SYN--\1--FIN--#g; s/<//g; s/>//g' | sed 's/--SYN--/</g; s/--FIN--[^<]*</></g; s/[^<]*</</; s/--FIN--.*/>/;' | sed "s#<[^>]*href=\([^a-zA-Z>]*[^ >]*\)[^>]*># @\1@#g; s/<[^>]*>//g; s/'//g; s/@/ /g;s/\"/ /g;"`
do
#getSubDir $i
#echo $1;echo $var
isLastDir $1$var
retvar=$?
if [ $retvar -gt 0 ];then
printLog "继续下一级目录";
#sleep 1;
downList "$1$var"
printLog "==================下一个根目录开始查找======================";echo
else
downloadJar $var
# download $var
#sleep 1
fi
done
}
rm -rf javen.log 2>&1 >/dev/null
downList $NEXUS_GROUP_BROWSE
执行脚本
使用 Git Bash 执行脚本
# -v 可打印每一条执行的指令
bash -v full_download.sh
脚本执行完成后,手动将下载的 jar 包 及 pom 文件目录复制到本地仓库
发布到私服
配置信息
配置server
在 settings.xml 中配置 server
<server>
<id>nexus-snapshot</id>
<username>zhangsan</username>
<password>zhangsan123</password>
</server>
<server>
<id>nexus-release</id>
<username>zhangsan</username>
<password>zhangsan123</password>
</server>
配置 pom
<!--注意限定版本一定为RELEASE,因为上传的对应仓库的存储类型为RELEASE -->
<!--指定仓库地址 -->
<distributionManagement>
<repository>
<!--此名称要和settings.xml中设置的server ID一致 -->
<id>nexus-release</id>
<name>Releases-Repository</name>
<url>http://172.18.11.3:21000/nexus/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshot</id>
<name>Snapshot-Repository</name>
<url>http://172.18.11.3:21000/nexus/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<build>
<plugins>
<!--发布代码Jar插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!--
发布源码插件:
1. 如果在多项目的构建中,maven-source-plugin放在顶层的pom中是不会起作用的,需要放到具体的某一个项目中
2. 使用了该插件,在deploy到远程仓库后也会带上该项目的source文件
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<!-- 绑定source插件到Maven的生命周期,并在生命周期后执行绑定的source的goal -->
<executions>
<execution>
<!-- 绑定source插件到Maven的生命周期 -->
<phase>compile</phase>
<!--在生命周期后执行绑定的source插件的goals -->
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
发布jar包
命令行发布
# DgroupId、DartifactId、Dversion:构成了该jar包在pom.xml的坐标,自己起名字也是可以的.
# Dpackaging:表示打包类型.
# Dfile:表示需要上传的jar包的绝对路径.
# Durl:私服上第三方仓库的地址,打开nexus——>repositories菜单,可以看到该路径。
# DrepositoryId:服务器的表示id,就是我们在setting.xml文件中配置的serverId。
mvn deploy:deploy-file -DgroupId=com.xuxu -DartifactId=commons-lang3-3.7 -Dversion=3.7 -Dpackaging=jar -Dfile=C:\Users\Administrator\Desktop\testjar\commons-lang3-3.7.jar -Durl=http://172.18.11.3:21000/nexus/repository/maven-releases/ -DrepositoryId=nexus-release
通过配置发布
使用如下指令,会自动读取 settings.xml 和 pom.xml 中的对应配置,进行发布
mvn clean deploy
参考文档
maven多仓库优先级_lakernote的博客-CSDN博客_maven配置多个mirror优先级
深入比较几种maven仓库的优先级 | 大染志 (toozhao.com)
使用Docker搭建Maven私服__wangjianfeng的博客-CSDN博客
docker搭建maven私服_q495673918的博客-CSDN博客_docker maven私服
Nexus3.x批量导入本地库(Windows版)_施主、请留步。的博客-CSDN博客_windows nexus3批量上传