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

问题描述 投票:51回答:8

我在.m2文件夹中有太多文件,其中maven存储下载的依赖项。有没有办法清理所有旧的依赖项?例如,如果存在3个不同版本的依赖关系:1,2和3,清理后必须只有第3个版本。我如何为.m2文件夹中的所有依赖项执行此操作?

java maven dependencies repository dependency-management
8个回答
27
投票

如果您使用的是Unix,则可以使用其中文件的访问时间。只需为您的文件系统启用访问时间,然后运行您希望保留依赖关系的所有项目的干净构建,然后执行类似这样的操作(UNTESTED!):

find ~/.m2 -amin +5 -iname '*.pom' | while read pom; do parent=`dirname "$pom"`; rm -Rf "$parent"; done

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

在rm之前添加“echo”以进行“干运行”。


24
投票

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

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

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

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


6
投票

给定maven项目的POM文件,您可以使用Apache Maven Dependency Plugin删除本地存储库中的所有依赖项(默认情况下为〜/ .m2 / respository)。

它包含dependency:purge-local-repository功能,可从本地存储库中删除项目依赖项,并可选择重新解析它们。

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

此命令行调用应该工作:

mvn dependency:purge-local-repository -DreResolve=false

4
投票
  1. 下载项目的所有实际依赖项 find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
  2. 将您的本地maven存储库移动到临时位置 mv ~/.m2 ~/saved-m2
  3. 将所有文件maven-metadata-central.xml *从已保存的存储库重命名为maven-metadata.xml * find . -type f -name "maven-metadata-central.xml*" -exec rename -v -- 's/-central//' '{}' \;
  4. 要将本地存储库的修改后的副本设置为镜像,请使用以下内容创建目录〜/ .m2和文件〜/ .m2 / settings.xml(将用户替换为您的用户名): <settings> <mirrors> <mirror> <id>mycentral</id> <name>My Central</name> <url>file:/home/user/saved-m2/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings>
  5. 再次解决您的项目依赖项: find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
  6. 现在您拥有本地maven存储库,其中包含最少的必要工件。从配置文件和文件系统中删除本地镜像。

1
投票

我也想从我的Maven存储库中删除旧的依赖项。我想过只运行Florian的答案,但是我想要一些我可以反复运行的东西,而不记得一个长的linux片段,我想要一些具有一点可配置性的东西 - 更多的是程序,而不是一串unix命令所以我采用了基本的想法并将其变成了一个(相对较小的)Ruby程序,它根据上次访问时间删除旧的依赖项。

它不会删除“旧版本”,但由于您实际上可能有两个不同的活动项目,其中包含两个不同版本的依赖项,因此无论如何都不会完成我想要的操作。相反,像Florian的回答一样,它删除了最近未访问的依赖项。

如果你想尝试一下,你可以:

  1. 访问GitHub repository
  2. 克隆存储库,或下载源
  3. (可选)检查代码以确保它不是恶意的
  4. 运行bin/mvnclean

有一些选项可以覆盖默认的Maven存储库,忽略文件,设置阈值日期,但是您可以在GitHub上的README中阅读这些选项。

在我完成了一些工作之后,我可能会在某些时候将它打包为Ruby gem,这将简化问题(gem install mvnclean; mvnclean),如果你已经安装了Ruby并且可以运行。


1
投票

只需清理.m2 - > repository文件夹下的每个内容。当您构建项目时,所有依赖项都会加载到此处。

在您的情况下,您的项目可能是您之前使用旧版本的任何依赖项,现在版本已升级。所以更好地清理.m2文件夹并使用mvn clean install构建项目。

现在,将在此文件夹中下载与最新版本模块的依赖项。


0
投票

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

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


0
投票

您需要复制项目所需的依赖项。掌握这些内容后,请清除项目中POM.XML文件中嵌入到<dependency>标记中的所有<dependencies>标记。

保存文件后,您将无法在Libraries中看到Maven Dependencies。然后请粘贴您之前复制的那些<dependency>

所需的罐子将由Maven自动下载,您可以在保存文件后在生成的Maven Dependencies Libraries中看到。

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.