python(40) : 根据maven依赖信息从本地仓库导出依赖包

1.说明

根据libs.txt去本地maven仓库里面检索到指定jar包, 然后压缩为libs.zip

2.libs.txt

需要导出的依赖列表, 每行一个, 格式为 {groupId}:{artifactId}:{version}

org.apache.commons.discovery:discovery:0.2
org.apache.commons.logging:logging:1.0.4
javax.wsdl:wsdl:1.5.1

3.repository_path.txt

D:\apache-maven-3.6.3\repository

4.run.py

执行导出依赖的脚本, libs.txt和repository_path.txt放在当前目录即可

import os
import sys
import time

from loguru import logger

import zipfile
import os


def files_to_zip(zip_filename, file_paths):
    logger.info(f'开始打包jar, 数量:{len(file_paths)}')
    """
    将一组文件(绝对路径)打包成 ZIP 文件

    :param zip_filename: 输出的 ZIP 文件名(如 'archive.zip')
    :param file_paths: 文件绝对路径的列表(list of str)
    """
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for file_path in file_paths:
            if os.path.isfile(file_path):
                # 将文件以相对路径(仅文件名)添加到 ZIP 中
                # 你也可以使用 arcname 控制 ZIP 内部路径
                zipf.write(file_path, arcname=os.path.basename(file_path))
            else:
                print(f"警告: 文件不存在,已跳过: {file_path}")


# 计算文件大小
def get_readable_size(file_path):
    """
    返回文件大小的可读字符串,如 5.23 KB, 1.45 MB, 2.10 GB
    """
    if not os.path.exists(file_path):
        return "文件不存在"

    size_bytes = os.path.getsize(file_path)

    # 定义单位和对应的转换
    for unit, divisor in [
        ('B', 1),
        ('KB', 1024),
        ('MB', 1024 ** 2),
        ('GB', 1024 ** 3),
        ('TB', 1024 ** 4)
    ]:
        if size_bytes < 1024 * divisor:
            size = size_bytes / divisor
            return f"{size:.2f} {unit}"

    # 超过 TB 的情况
    size_tb = size_bytes / (1024 ** 4)
    return f"{size_tb:.2f} TB"


st = time.time()

# 要打包的jar列表
with open('libs.txt', 'r', encoding='utf-8') as f:
    content = f.read()
cl = len(content.split('\n'))
logger.info(f'读取到待打包的列表, 数量:{cl}')

# 仓库路径
with open('repository_path.txt', 'r', encoding='utf-8') as f:
    r = f.read()
    if not os.path.exists(r):
        logger.error(f'仓库路径【{r}】不存在')
        time.sleep(5)
        sys.exit(0)

# 查找jar
jars = []
for lib in content.split('\n'):
    try:
        m = lib.split(':')
        f = os.path.join(r, os.sep.join(m[0].split('.')), m[1], m[2])
        print(f)
        if not os.path.exists(f):
            continue
        for file in os.listdir(f):
            if m[1] in file and m[2] in file and file.endswith('jar'):
                jars.append(os.path.join(f, file))
                logger.info(f'已找到jar: {file}')
    except Exception as e:
        logger.warning(f'jar包格式错误! {lib}')

if len(jars) == 0:
    logger.error(f'未检索到对应的jar')
    time.sleep(5)
    sys.exit(0)
files_to_zip('libs.zip', jars)

size_str = get_readable_size('libs.zip')
logger.info(f'jar打包完成, 耗时:{round(time.time() - st, 2)}秒, 压缩包大小:{size_str}, jar包数量:{len(jars)}')
logger.warning('5秒后将会自动关闭该窗口')
time.sleep(5)

# pyinstaller -F -i package.png main.py --clean --noconfirm

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值