自动清理Maven本地仓库的脚本

wen 实用脚本 2

本文目录导读:

自动清理Maven本地仓库的脚本

  1. Windows Batch 版本 (clean-maven.bat)
  2. PowerShell 版本 (clean-maven.ps1)
  3. Linux/Mac Shell 版本 (clean-maven.sh)
  4. 使用说明:
  5. 进阶脚本:自定义清理策略 (clean-maven-advanced.sh)
  6. 定时清理(可选)
  7. 注意事项

我来帮你写一个自动清理Maven本地仓库的脚本,根据不同的操作系统,我提供以下几个版本:

Windows Batch 版本 (clean-maven.bat)

@echo off
chcp 65001 >nul
:: Maven本地仓库路径
set MAVEN_REPO=%USERPROFILE%\.m2\repository
:: 清理日志文件
echo 开始清理Maven本地仓库...
echo 仓库路径: %MAVEN_REPO%
:: 清理lastUpdated文件
echo 清理*.lastUpdated文件...
del /s /q "%MAVEN_REPO%\*.lastUpdated" 2>nul
:: 清理下载失败的临时文件
echo 清理临时文件...
for /d /r "%MAVEN_REPO%" %%d in (*.part) do (
    if exist "%%d" (
        rd /s /q "%%d"
        echo 删除: %%d
    )
)
:: 清理空的目录
echo 清理空目录...
for /f "delims=" %%d in ('dir /ad /s /b "%MAVEN_REPO%" ^| sort /r') do (
    dir /a /b "%%d" 2>nul | findstr /v "^$" >nul || (
        rd "%%d" 2>nul
        echo 删除空目录: %%d
    )
)
:: 清理特定版本的旧版本(保留最新版本)
echo 清理旧版本(只保留最新的3个版本)...
for /d %%a in ("%MAVEN_REPO%\*") do (
    for /d %%b in ("%%a\*") do (
        setlocal enabledelayedexpansion
        set count=0
        for /f "delims=" %%c in ('dir /ad /b /o-n "%%b"') do (
            set /a count+=1
            if !count! gtr 3 (
                rd /s /q "%%b\%%c"
                echo 清理旧版本: %%b\%%c
            )
        )
        endlocal
    )
)
echo.
echo 清理完成!
pause

PowerShell 版本 (clean-maven.ps1)

# Maven本地仓库路径
$mavenRepo = "$env:USERPROFILE\.m2\repository"
Write-Host "开始清理Maven本地仓库..." -ForegroundColor Green
Write-Host "仓库路径: $mavenRepo" -ForegroundColor Yellow
# 清理lastUpdated文件
Write-Host "清理*.lastUpdated文件..." -ForegroundColor Cyan
Get-ChildItem -Path $mavenRepo -Filter "*.lastUpdated" -Recurse -Force | Remove-Item -Force -ErrorAction SilentlyContinue
# 清理下载失败的临时文件
Write-Host "清理临时文件..." -ForegroundColor Cyan
Get-ChildItem -Path $mavenRepo -Filter "*.part" -Recurse -Force | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
# 清理空的目录
Write-Host "清理空目录..." -ForegroundColor Cyan
Get-ChildItem -Path $mavenRepo -Directory -Recurse -Force | 
    Where-Object { $_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 } | 
    Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
# 清理特定版本的旧版本(保留最新3个版本)
Write-Host "清理旧版本..." -ForegroundColor Cyan
Get-ChildItem -Path $mavenRepo -Directory | ForEach-Object {
    $groupDir = $_
    Get-ChildItem -Path $groupDir.FullName -Directory | ForEach-Object {
        $artifactDir = $_
        $versions = Get-ChildItem -Path $artifactDir.FullName -Directory | 
            Sort-Object Name -Descending
        if ($versions.Count -gt 3) {
            $versions | Select-Object -Skip 3 | ForEach-Object {
                Remove-Item -Path $_.FullName -Force -Recurse -ErrorAction SilentlyContinue
                Write-Host "清理旧版本: $($_.FullName)" -ForegroundColor DarkGray
            }
        }
    }
}
Write-Host "清理完成!" -ForegroundColor Green
Write-Host "按任意键退出..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Linux/Mac Shell 版本 (clean-maven.sh)

#!/bin/bash
# Maven本地仓库路径
MAVEN_REPO="$HOME/.m2/repository"
echo "开始清理Maven本地仓库..."
echo "仓库路径: $MAVEN_REPO"
# 清理lastUpdated文件
echo "清理*.lastUpdated文件..."
find "$MAVEN_REPO" -name "*.lastUpdated" -type f -delete 2>/dev/null
# 清理下载失败的临时文件
echo "清理临时文件..."
find "$MAVEN_REPO" -name "*.part" -type d -exec rm -rf {} \; 2>/dev/null
find "$MAVEN_REPO" -name "*.part" -type f -delete 2>/dev/null
# 清理空的目录
echo "清理空目录..."
find "$MAVEN_REPO" -type d -empty -delete 2>/dev/null
# 清理特定版本的旧版本(保留最新3个版本)
echo "清理旧版本..."
for group_dir in "$MAVEN_REPO"/*/; do
    if [ -d "$group_dir" ]; then
        for artifact_dir in "$group_dir"*/; do
            if [ -d "$artifact_dir" ]; then
                # 获取排序后的版本列表
                versions=($(ls -1v "$artifact_dir" 2>/dev/null | sort -r))
                count=${#versions[@]}
                if [ $count -gt 3 ]; then
                    # 删除除最新3个版本外的所有版本
                    for ((i=3; i<$count; i++)); do
                        version_path="${artifact_dir}${versions[$i]}"
                        if [ -d "$version_path" ]; then
                            rm -rf "$version_path"
                            echo "清理旧版本: $version_path"
                        fi
                    done
                fi
            fi
        done
    fi
done
# 再次清理可能产生的空目录
find "$MAVEN_REPO" -type d -empty -delete 2>/dev/null
echo ""
echo "清理完成!"

使用说明:

Windows 用户

  1. Batch版本:双击运行 clean-maven.bat 或在CMD中执行
  2. PowerShell版本:右键 clean-maven.ps1 → 选择"使用PowerShell运行"

⚠️ PowerShell执行策略:如果遇到执行策略限制,使用管理员权限运行:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Linux/Mac 用户

# 给脚本添加执行权限
chmod +x clean-maven.sh
# 运行脚本
./clean-maven.sh

进阶脚本:自定义清理策略 (clean-maven-advanced.sh)

#!/bin/bash
# 配置参数
MAVEN_REPO="$HOME/.m2/repository"
KEEP_VERSIONS=3  # 保留的最新版本数量
CLEAN_INTERVAL_DAYS=30  # 清理超过30天没有访问的依赖
echo "====== Maven仓库清理工具 ======"
echo "仓库路径: $MAVEN_REPO"
echo "保留版本数: $KEEP_VERSIONS"
echo "清理间隔: $CLEAN_INTERVAL_DAYS天"
echo "================================"
# 清理函数
clean_lastupdated() {
    echo "1. 清理*.lastUpdated文件..."
    find "$MAVEN_REPO" -name "*.lastUpdated" -type f -exec rm -f {} \; -printf "删除: %p\n"
}
clean_temporary() {
    echo "2. 清理临时文件..."
    find "$MAVEN_REPO" -name "*.part" -exec rm -rf {} \; -printf "删除: %p\n" 2>/dev/null
    find "$MAVEN_REPO" -name "*.tmp" -exec rm -f {} \; -printf "删除: %p\n" 2>/dev/null
}
clean_old_versions() {
    echo "3. 清理旧版本(保留最近$KEEP_VERSIONS个版本)..."
    local cleaned=0
    for group_dir in "$MAVEN_REPO"/*/; do
        [ -d "$group_dir" ] || continue
        for artifact_dir in "$group_dir"*/; do
            [ -d "$artifact_dir" ] || continue
            # 获取版本列表
            versions=($(ls -1 "$artifact_dir" 2>/dev/null | sort -Vr))
            count=${#versions[@]}
            if [ $count -gt $KEEP_VERSIONS ]; then
                for ((i=$KEEP_VERSIONS; i<$count; i++)); do
                    version_path="${artifact_dir}${versions[$i]}"
                    if [ -d "$version_path" ]; then
                        rm -rf "$version_path"
                        echo "  [清理] $version_path"
                        ((cleaned++))
                    fi
                done
            fi
        done
    done
    echo "  共清理了 $cleaned 个旧版本"
}
clean_unused() {
    echo "4. 清理超过${CLEAN_INTERVAL_DAYS}天未使用的依赖..."
    find "$MAVEN_REPO" -atime +$CLEAN_INTERVAL_DAYS -type f -name "*.jar" \
        -exec rm -f {} \; -printf "删除: %p\n" 2>/dev/null
}
clean_empty_dirs() {
    echo "5. 清理空目录..."
    find "$MAVEN_REPO" -type d -empty -delete -printf "删除空目录: %p\n" 2>/dev/null
    find "$MAVEN_REPO" -type d -empty -delete 2>/dev/null  # 再次清理
}
# 主函数
main() {
    echo -e "\n开始清理..."
    clean_lastupdated
    clean_temporary
    clean_old_versions
    clean_unused
    clean_empty_dirs
    # 统计清理后的仓库大小
    if [ -d "$MAVEN_REPO" ]; then
        size=$(du -sh "$MAVEN_REPO" 2>/dev/null | cut -f1)
        echo -e "\n仓库当前大小: $size"
    fi
    echo -e "\n清理完成!"
}
# 执行主函数
main

定时清理(可选)

Linux/Mac (添加crontab)

# 每月1号凌晨2点执行清理
crontab -e
# 添加以下行
0 2 1 * * /path/to/clean-maven.sh >> /var/log/maven-clean.log 2>&1

Windows (任务计划程序)

  1. 打开"任务计划程序"
  2. 创建基本任务
  3. 设置触发器(如每周一凌晨3点)
  4. 操作选择启动程序:clean-maven.bat

注意事项

  1. 备份重要依赖:建议在清理前确认没有正在使用的项目依赖
  2. IDE缓存:清理后建议重启IDE(如IntelliJ IDEA、Eclipse等)
  3. 网络依赖:如果清理了正在使用的依赖,下次构建时会重新下载
  4. 磁盘空间:清理后可以释放大量磁盘空间

选择适合你操作系统的脚本使用即可!

抱歉,评论功能暂时关闭!