场景描述
最近要在内网搭建nexus服务,因无法访问互联网,所以想把本地的依赖包上传到nexus中。
方案一
nexus2可以通过直接把本地文件目录直接放到服务器相应目录解决
复制本地仓库:``D:\\maven\\repository``到nexus库路径:``D:\\sonatype-work\\nexus\\storage\\central``
方案二
nexus3无法通过上面的方式解决,但是从网友那得到了一个上传脚本如下:
#!/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 './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 {} NULL/{} ;
方案三
但是方案二的上传脚本无法多线程上传,比较慢,所以自己根据该shell脚本做了python多线程版,如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import requests
from requests.auth import HTTPBasicAuth
import sys
if sys.version > '3':
import queue as Queue
else:
import Queue
import threading
import time
repoUrl='http://10.xx.xx.xx:8081/repository/maven-release'
userName='xxxx'
password='gjx2021'
repoPath='D:/sdk/repository'
threadNum=10
def putFile(filePath,homePath,url):
path = homePath+'/'+filePath
print('正在上传' + path)
try:
url = repoUrl+'/'+filePath
r = requests.put(url, data=open(path,'rb').read(),files={},headers={}, auth=HTTPBasicAuth(userName, password))
r.raise_for_status()
except requests.RequestException as e:
print(e)
def findFile(file):
for root, dirs, files in os.walk(file):
# root 表示当前正在访问的文件夹路径
# dirs 表示该文件夹下的子目录名list
# files 表示该文件夹下的文件list
# 遍历文件
for f in files:
if(f.endswith('.pom') or f.endswith('.jar')):
filePath = os.path.join(root,f).replace('\\','/').replace(file+'/','')
putFile(filePath,file,repoUrl)
#if __name__=='__main__':
#findFile(repoPath)
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, q):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.q = q
def run(self):
print("Starting " + self.name)
process_data(self.name, self.q)
print("Exiting " + self.name)
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire()
if not workQueue.empty():
data = q.get()
queueLock.release()
putFile(data,repoPath,repoUrl)
print("%s processing %s" % (threadName, data))
else:
queueLock.release()
queueLock = threading.Lock()
workQueue = Queue.Queue(0)
threads = []
threadID = 1
# 创建新线程
for tName in range(threadNum):
thread = myThread(threadID, "Thread-%d" % tName, workQueue)
thread.start()
threads.append(thread)
threadID += 1
# 填充队列
queueLock.acquire()
for root, dirs, files in os.walk(repoPath):
for f in files:
if(f.endswith('.pom') or f.endswith('.jar')):
filePath = os.path.join(root,f).replace('\\','/').replace(repoPath+'/','')
workQueue.put(filePath)
queueLock.release()
# 等待队列清空
while not workQueue.empty():
pass
# 通知线程是时候退出
exitFlag = 1
# 等待所有线程完成
for t in threads:
t.join()
print("Exiting Main Thread")