Che*_*rry 55 java dependencies repository dependency-management maven
我在.m2文件夹中有太多文件,其中maven存储下载的依赖项.有没有办法清理所有旧的依赖项?例如,如果存在3个不同版本的依赖关系:1,2和3,清理后必须只有第3个版本.我如何为.m2文件夹中的所有依赖项执行此操作?
Flo*_*ian 31
如果您使用的是Unix,则可以使用其中文件的访问时间.只需为您的文件系统启用访问时间,然后运行您希望保留依赖关系的所有项目的干净构建,然后执行类似这样的操作(UNTESTED!):
find ~/.m2 -amin +5 -iname '*.pom' | while read pom; do parent=`dirname "$pom"`; rm -Rf "$parent"; done
这将找到所有*.pom文件,这些文件最后一次访问时间超过5分钟(假设你最近5分钟前开始构建)并删除它们的目录.
在rm之前添加"echo"以进行"干运行".
Gya*_*edi 25
简短回答 - 删除.m2文件夹{user.home}.例如在Windows 10用户家中C:\Users\user1.使用重建您的项目mvn clean package.只保留那些项目所需的依赖项.
长答案 - .m2文件夹就像普通文件夹一样,文件夹的内容是从不同的项目构建的.我认为没有办法自动弄清楚哪个库是"旧的".事实上,旧的是一个模糊的词.在项目中使用先前版本的库时可能有很多原因,因此无法确定哪一个未使用.
您所能做的就是删除.m2文件夹并重新构建所有项目,然后该文件夹将自动构建所有必需的库.
如果您只关心在所有项目中使用的特定版本的库; 重要的是项目的pom也应该更新到最新版本.即如果不同的POM引用库的不同版本,则所有将在.m2中下载.
给定maven项目的POM文件,您可以使用Apache Maven Dependency Plugin删除本地存储库中的所有依赖项(默认情况下为〜/ .m2/respository).它包括依赖项:purge-local-repository功能,用于从本地存储库中删除项目依赖项,并可选择重新解析它们.
要清除本地依赖项,只需使用可选参数reResolve并将其设置为false,因为默认情况下它设置为true.
此命令行调用应该起作用:mvn dependency:purge-local-repository -DreResolve = false
小智 6
下载项目的所有实际依赖项
find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
将您的本地 Maven 存储库移动到临时位置
mv ~/.m2 ~/saved-m2
将保存的存储库中的所有文件 maven-metadata-central.xml* 重命名为 maven-metadata.xml*
find . -type f -name "maven-metadata-central.xml*" -exec rename -v -- 's/-central//' '{}' \;
要将本地存储库的修改副本设置为镜像,请使用以下内容创建目录 ~/.m2 和文件 ~/.m2/settings.xml(用您的用户名替换user):
<settings>
 <mirrors>
  <mirror>
   <id>mycentral</id>
   <name>My Central</name>
   <url>file:/home/user/saved-m2/</url>
   <mirrorOf>central</mirrorOf>
  </mirror>
 </mirrors>
</settings>
再次解决您的项目依赖项:
find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
现在您拥有了最少必要工件的本地 Maven 存储库。从配置文件和文件系统中删除本地镜像。
我想出了一个实用程序并托管在 GitHub 上,以清理本地 Maven 存储库中的旧版本库。该实用程序在其默认执行时会删除所有旧版本的工件,仅保留最新的工件。或者,它可以删除所有快照、源、javadoc,并且还可以在此过程中强制/排除组或工件。此跨平台还支持基于上次访问/下载日期的基于日期的删除。
https://github.com/techpavan/mvn-repo-cleaner
自从提出这个问题已经 6 年多了,但我仍然没有找到任何工具来令人满意地清理我的存储库。所以我自己用 Python 写了一个来摆脱旧的本地人工制品。也许它对其他人也有用:
repo-cleaner.py:
from os.path import isdir
from os import listdir
import shutil
import semver
import Constants
# Change to True to get a log of what will be removed
dry_run = False
def check_and_clean(path):
    files = listdir(path)
    only_files = True
    for index, file in enumerate(files):
        if isdir('/'.join([path, file])):
            only_files = False
        else:
            files[index] = None
    if only_files:
        return
    directories = [d for d in files if d is not None]
    latest_version = check_if_versions(directories)
    if latest_version is None:
        for directory in directories:
            check_and_clean('/'.join([path, directory]))
    elif len(directories) == 1:
        return
    else:
        print('Update ' + path.split(Constants.m2_path)[1])
        for directory in directories:
            if directory == latest_version:
                continue
            print(directory + ' (Has newer version: ' + latest_version + ')')
            if not dry_run:
                shutil.rmtree('/'.join([path, directory]))
def check_if_versions(directories):
    if len(directories) == 0:
        return None
    latest_version = ''
    for directory in directories:
        try:
            current_version = semver.VersionInfo.parse(directory)
        except ValueError:
            return None
        if latest_version == '':
            latest_version = directory
        if current_version.compare(latest_version) > 0:
            latest_version = directory
    return latest_version
if __name__ == '__main__':
    check_and_clean(Constants.m2_path)
Constants.py (编辑以指向您自己的本地 Maven 存储库):
# Paths
m2_path = '/home/jb/.m2/repository/'
确保您安装了 Python 3.6+ 并且semver包已安装到您的全局环境中或venv(pip install semver如果缺少则使用)。
运行脚本python repo-cleaner.py。
它在您配置的本地 Maven 存储库中递归搜索(通常~/.m2/repository),如果它找到不同版本所在的目录,它将删除所有版本,但最新版本除外。
假设您在本地 Maven 存储库中的某处有以下树:
.
??? antlr
    ??? 2.7.2
    ?   ??? antlr-2.7.2.jar
    ?   ??? antlr-2.7.2.jar.sha1
    ?   ??? antlr-2.7.2.pom
    ?   ??? antlr-2.7.2.pom.sha1
    ?   ??? _remote.repositories
    ??? 2.7.7
        ??? antlr-2.7.7.jar
        ??? antlr-2.7.7.jar.sha1
        ??? antlr-2.7.7.pom
        ??? antlr-2.7.7.pom.sha1
        ??? _remote.repositories
然后脚本删除了 2.7.2 版,antlr剩下的是:
.
??? antlr
    ??? 2.7.7
        ??? antlr-2.7.7.jar
        ??? antlr-2.7.7.jar.sha1
        ??? antlr-2.7.7.pom
        ??? antlr-2.7.7.pom.sha1
        ??? _remote.repositories
任何旧版本,即使是您经常使用的版本,都将被删除。它可以使用 Maven(或其他管理依赖项的工具)轻松恢复。
您可以通过设置dry_run = True. 输出将如下所示:
    update /org/projectlombok/lombok
    1.18.2 (newer version: 1.18.6)
    1.16.20 (newer version: 1.18.6)
这意味着 lombok 的 1.16.20 和 1.18.2 版本将被删除,而 1.18.6 将保持不变。
上述文件的最新版本可以在我的github上找到。
| 归档时间: | 
 | 
| 查看次数: | 112702 次 | 
| 最近记录: |