首页 > 编程语言 >基于 python 的 nexus 私服 jar 包匹配查找程序

基于 python 的 nexus 私服 jar 包匹配查找程序

时间:2023-05-26 11:22:37浏览次数:44  
标签:python 私服 jar url pom print path groupId

程序通过计算 jar 包的 sha1 摘要,到 maven 仓库查询对应路径,适用于 Nexus Repository Manager OSS 2.14.11-01,其他版本未做测试

注意:jar 包路径中不要出现空格
#!/usr/bin/python3

import hashlib
import os
import requests
import sys
import tempfile
from xml.etree import ElementTree
import zipfile

nexus_repo_url = ["http://172.17.0.71:8081/nexus/service/local/repositories/snapshots", "http://172.17.0.71:8081/nexus/service/local/repositories/releases"]

## 欢迎信息
def welcome():
    print("\n程序通过计算jar包的sha1摘要,到maven仓库查询对应路径")
    print("\n程序适用于 Nexus Repository Manager OSS 2.14.11-01,其他版本未做测试")
    print("\n注意:jar包路径中不要出现空格")

## 获取jar包路径
def get_jar_path():
    print("\n拖拽jar包到窗并口回车提交:", end = "")
    try:
        jar_path = input()
        if os.path.exists(jar_path):
            if jar_path.endswith(".jar"):
                return jar_path
            else:
                print("\n请选择以【.jar】结尾的jar包文件")
        else:
            print("\n文件不存在")
        sys.exit()
    except KeyboardInterrupt:
        print("\n\n操作取消,程序退出")
        sys.exit()

## 计算jar包文件的sha1摘要
def get_jar_sha1sum(jar_path):
    with open(jar_path, 'rb') as f:
        return hashlib.new("sha1", f.read()).hexdigest()

## 获取jar包的坐标信息
def get_maven_gav(jar_path):
    temp_dir = tempfile.TemporaryDirectory()
    f = zipfile.ZipFile(jar_path, 'r')
    for file in f.namelist():
        f.extract(file, temp_dir.name)
    maven_dir = temp_dir.name + "/META-INF/maven"
    pom_path = maven_dir
    pom_path = pom_path + "/" + os.listdir(maven_dir)[0]
    pom_path = pom_path + "/" + os.listdir(pom_path)[0] + "/pom.properties"
    f.close()
    groupId = ""
    artifactId = ""
    version = ""
    with open(pom_path, 'r') as f:
        for line in f.readlines():
            if line.startswith("groupId="):
                groupId = line[len("groupId="):].strip()
            elif line.startswith("artifactId="):
                artifactId = line[len("artifactId="):].strip()
            elif line.startswith("version="):
                version = line[len("version="):].strip()
    return groupId, artifactId, version

## 获取jar包及pom文件下载地址
def get_item_url(sha1sum, groupId, artifactId, version):
    for repo_url in nexus_repo_url:
        print(f"\n尝试从【{repo_url}】中检索jar包")
        groupId_path_str = groupId.replace(".", "/")
        url = f"{repo_url}/content/{groupId_path_str}/{artifactId}/{version}"
        response = requests.get(url)
        if response.status_code == 200:
            items = ElementTree.fromstring(response.text).find("data").findall("content-item")
            for item in items:
                item_url = item.find("resourceURI").text
                if item_url.endswith(".jar.sha1"):
                    print("requests.get: " + item_url)
                    url_sha1sum = requests.get(item_url).text
                    if sha1sum == url_sha1sum:
                        # return item_url
                        url_prefix = item_url[:-(len(".jar.sha1"))]
                        return url_prefix + ".jar", url_prefix + ".pom"
        else:
            print(f"\n请求异常,请求地址:{url}")
    print("\n未匹配到正确的jar包")
    return None, None

## 开始处理
def process():
    jar_path = get_jar_path()
    sha1sum = get_jar_sha1sum(jar_path)
    print(f"\nsha1摘要   : {sha1sum}")
    groupId, artifactId, version = get_maven_gav(jar_path)
    print(f"groupId    : {groupId}")
    print(f"artifactId : {artifactId}")
    print(f"version    : {version}")
    jar_url, pom_url = get_item_url(sha1sum, groupId, artifactId, version)
    if jar_url and pom_url:
        print(f"\n成功匹配到jar包")
        print(f"\njar包下载地址: {jar_url}")
        print(f"\npom下载地址: {pom_url}")
    process()

if __name__ == '__main__':
    welcome()
    process()

 

标签:python,私服,jar,url,pom,print,path,groupId
From: https://www.cnblogs.com/nihaorz/p/17434258.html

相关文章

  • python · matplotlib | 如何绘制子图
    代码:importmatplotlib.pyplotaspltimportmatplotlibmatplotlib.rc("font",family='MicroSoftYaHei',weight="bold")fig,axs=plt.subplots(2,2,figsize=(15,12))colors=['blue','orange','green&#......
  • 如何让python程序在windows下开机启动
    说明简述:通过将启动脚本写入注册表\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run来实现开机自启问题:这种开机启动比较奇怪,运行路径是cmd.exe的路径,所以执行需要自启的程序时,读取其他相对路径的文件会有错误解决:执行启动前,切一下目录启动脚本importos......
  • Python工具箱系列(三十三)
    Timescaledb在物联网时代,出现了大量以时间为中心海量产生的传感器数据,称为时序数据。这类数据的特点是:数据记录总有一个时间戳。数据几乎总是追加,不更新也不删除。大量使用近期的数据。很少更新或者回填时间间隔的缺失数据。与时间间隔频率关系不大。但累积的数据量大,可能会有峰值......
  • CentOS7安装maven私服仓库nexus3教程
    大家好,我是程序员青戈,一个被Bug耽误了才艺的程序员......
  • python升级pip失败的最终解决办法
    玩点python卡在pip安装包上了,我用的是pycharm,在它的交互命令行里使用python-mpipinstall--upgradepip始终报错!Traceback(mostrecentcalllast):File"d:\soft\python3.7\lib\site-packages\pip\_vendor\urllib3\response.py",line331,in_error_catcheryield......
  • Python工具箱系列(三十三)
    Timescaledb在物联网时代,出现了大量以时间为中心海量产生的传感器数据,称为时序数据。这类数据的特点是:数据记录总有一个时间戳。数据几乎总是追加,不更新也不删除。大量使用近期的数据。很少更新或者回填时间间隔的缺失数据。与时间间隔频率关系不大。但累积的数据量......
  • Python图片与Base64相互转换
    importbase64#必须的pic=open("img.png","rb")#读取本地文件pic_base=base64.b64encode(pic.read())#本地文件转Base64数据,此时会出现编码带b'' 的情况pic_base=pic_base.decode('utf-8')#修正格式pic.close()#关闭importbase64pic=open("img.png&q......
  • Python 函数重载
    函数重载是指可以使用相同的函数名,但是函数参数类型和/或数量不同的多个函数。Python不支持函数重载,因为Python是一种动态类型语言,函数参数类型不需要在代码中声明,并且Python中的函数参数数量也可以是可变的。这意味着在同一个作用域内定义两个或两个以上具有相同名称但参数......
  • 疑难杂症(已解决) | 为什么出现python中tkinter创建界面需要一闪而过才进入主窗口?
    一、具体问题如图所示,我编写了一个主窗口的程序(如下所示,有兴趣的可以自己复制后运行),发现需要先进入第一个窗口再进入主界面,这不符合逻辑。 代码区域(完整代码):fromtkinterimport*classWinGUI(Tk):def__init__(self):super().__init__()self......
  • Python 数据库Insert语句脚本生成工具(SQL Server)
    编写这个小工具,是因为平时部署项目的时候,需要导出一些公共的数据(权限、参数设置等),覆盖插入正式环境。话不多说,直接上代码:importpyodbcimportwarningsimportdecimalimportwinregimportosimportconfigparserimporttimeimportdatetimewarnings.filterwarnings('igno......