如何从maven存储库中清除旧的依赖项?

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
Run Code Online (Sandbox Code Playgroud)

这将找到所有*.pom文件,这些文件最后一次访问时间超过5分钟(假设你最近5分钟前开始构建)并删除它们的目录.

在rm之前添加"echo"以进行"干运行".

  • 在OSX上(也可以在GNU工具上工作)`find~/.m2/repository/-atime +30 -iname'*.pom'-print0 | 读取-d''-r pom; 做echo rm -rf"$(dirname $ pom)"; 完成`其中'atime`是几天(与几分钟内的'amin`相比) (12认同)
  • 我使用`find ~/.m2 -atime +1w -iname '*.pom' | 在阅读 pom 时;do parent=$(dirname "$pom"); rm -rf "$parent"; done` 在 OSX 上对我有用。在其他unix上也应该可以正常工作:) (2认同)
  • 我只是爱上了“寻找” (2认同)

Gya*_*edi 25

简短回答 - 删除.m2文件夹{user.home}.例如在Windows 10用户家中C:\Users\user1.使用重建您的项目mvn clean package.只保留那些项目所需的依赖项.

长答案 - .m2文件夹就像普通文件夹一样,文件夹的内容是从不同的项目构建的.我认为没有办法自动弄清楚哪个库是"旧的".事实上,旧的是一个模糊的词.在项目中使用先前版本的库时可能有很多原因,因此无法确定哪一个未使用.

您所能做的就是删除.m2文件夹并重新构建所有项目,然后该文件夹将自动构建所有必需的库.

如果您只关心在所有项目中使用的特定版本的库; 重要的是项目的pom也应该更新到最新版本.即如果不同的POM引用库的不同版本,则所有将在.m2中下载.

  • 然后删除.m2文件夹,然后确保所有项目在pom.xml中只有新版本的jar条目.重建项目..m2文件夹仅保留最新版本. (2认同)

Jua*_*ron 7

给定maven项目的POM文件,您可以使用Apache Maven Dependency Plugin删除本地存储库中的所有依赖项(默认情况下为〜/ .m2/respository).它包括依赖项:purge-local-repository功能,用于从本地存储库中删除项目依赖项,并可选择重新解析它们.

要清除本地依赖项,只需使用可选参数reResolve并将其设置为false,因为默认情况下它设置为true.

此命令行调用应该起作用:mvn dependency:purge-local-repository -DreResolve = false

  • 很好 :) 但是这个清理依赖只针对当前项目,而不是所有存储库。 (3认同)
  • 确实如此!要清理整个存储库,我会手动删除./m2/repository中的目录,如之前或在较新版本的Nexus中所述(在2.6.4-02之后).它们提供了Scheduled任务[link](http:// blog.sonatype.com/2009/09/nexus-scheduled-tasks/#.VGUD52NGWdA)从存储库中删除发布库功能.它也可能有用 (2认同)

小智 6

  1. 下载项目的所有实际依赖项

    find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将您的本地 Maven 存储库移动到临时位置

    mv ~/.m2 ~/saved-m2
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将保存的存储库中的所有文件 maven-metadata-central.xml* 重命名为 maven-metadata.xml*

    find . -type f -name "maven-metadata-central.xml*" -exec rename -v -- 's/-central//' '{}' \;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 要将本地存储库的修改副本设置为镜像,请使用以下内容创建目录 ~/.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>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 再次解决您的项目依赖项:

    find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
    
    Run Code Online (Sandbox Code Playgroud)
  6. 现在您拥有了最少必要工件的本地 Maven 存储库。从配置文件和文件系统中删除本地镜像。


Pav*_*mar 5

我想出了一个实用程序并托管在 GitHub 上,以清理本地 Maven 存储库中的旧版本库。该实用程序在其默认执行时会删除所有旧版本的工件,仅保留最新的工件。或者,它可以删除所有快照、源、javadoc,并且还可以在此过程中强制/排除组或工件。此跨平台还支持基于上次访问/下载日期的基于日期的删除。

https://github.com/techpavan/mvn-repo-cleaner


And*_*cus 5

自从提出这个问题已经 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)
Run Code Online (Sandbox Code Playgroud)

Constants.py (编辑以指向您自己的本地 Maven 存储库):

# Paths
m2_path = '/home/jb/.m2/repository/'
Run Code Online (Sandbox Code Playgroud)

确保您安装了 Python 3.6+ 并且semver包已安装到您的全局环境中或venvpip 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
Run Code Online (Sandbox Code Playgroud)

然后脚本删除了 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
Run Code Online (Sandbox Code Playgroud)

任何旧版本,即使是您经常使用的版本,都将被删除。它可以使用 Maven(或其他管理依赖项的工具)轻松恢复。

您可以通过设置dry_run = True. 输出将如下所示:

    update /org/projectlombok/lombok
    1.18.2 (newer version: 1.18.6)
    1.16.20 (newer version: 1.18.6)
Run Code Online (Sandbox Code Playgroud)

这意味着 lombok 的 1.16.20 和 1.18.2 版本将被删除,而 1.18.6 将保持不变。

上述文件的最新版本可以在我的github上找到。