我在.m2文件夹中有太多存储下载依赖项的Maven文件。 是否有办法清理所有旧的依赖项? 例如,如果有一个带有3个不同版本(1、2和3)的依赖项,在清理后必须只剩下第3个版本。 我如何为.m2文件夹中的所有依赖项做到这一点?
我在.m2文件夹中有太多存储下载依赖项的Maven文件。 是否有办法清理所有旧的依赖项? 例如,如果有一个带有3个不同版本(1、2和3)的依赖项,在清理后必须只剩下第3个版本。 我如何为.m2文件夹中的所有依赖项做到这一点?
如果你使用的是Unix系统,你可以利用文件的访问时间。只需启用文件系统的访问时间,然后对所有需要保留依赖关系的项目进行干净的构建,最后执行以下操作(未经测试!):
find ~/.m2 -amin +5 -iname '*.pom' | while read pom; do parent=`dirname "$pom"`; rm -Rf "$parent"; done
这将查找所有最近五分钟内未访问的 *.pom 文件(假设您的构建在最多 5 分钟前启动),并删除它们所在的目录。
在 rm 前添加 "echo " 以进行“干运行”。
find ~/.m2/repository/ -atime +30 -iname '*.pom' -print0 | while read -d '' -r pom; do echo rm -rf "$(dirname $pom)"; done
,其中的atime
表示天数(与分钟级别的amin
相比)。注意不要更改原意,但需要使内容更加通俗易懂。 - bric3find ~/.m2 -atime +1w -iname '*.pom' | while read pom; do parent=$(dirname "$pom"); rm -rf "$parent"; done
在我的OSX上运行良好。在其他Unix系统上也应该可以正常工作 :) - Meehdependency:purge-local-repository
功能,可将项目依赖项从本地仓库中删除,并可选择重新解析它们。mvn dependency:purge-local-repository -DreResolve=false
{user.home}
中删除.m2文件夹。例如,在Windows 10中,用户主目录为C:\Users\user1
。使用mvn clean package
重新构建您的项目。只有那些项目所需的依赖项才会保留。
详细回答 -
.m2文件夹就像一个普通的文件夹,其内容由不同的项目构建。我认为没有自动确定哪个库是“旧”的方法。实际上,“旧”是一个模糊的词。使用以前版本的库的原因可能有很多,因此确定哪个未使用是不可能的。Download all actual dependencies of your projects
find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
Move your local maven repository to temporary location
mv ~/.m2 ~/saved-m2
Rename all files maven-metadata-central.xml* from saved repository into maven-metadata.xml*
find . -type f -name "maven-metadata-central.xml*" -exec rename -v -- 's/-central//' '{}' \;
To setup the modified copy of the local repository as a mirror, create the directory ~/.m2 and the file ~/.m2/settings.xml with the following content (replacing user with your username):
<settings>
<mirrors>
<mirror>
<id>mycentral</id>
<name>My Central</name>
<url>file:/home/user/saved-m2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
Resolve your projects dependencies again:
find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
Now you have local maven repository with minimal of necessary artifacts. Remove local mirror from config file and from file system.
这个问题已经被提出六年以上了,但我仍然没有找到任何一个能够满意地清理我的存储库的工具。因此,我自己用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+,并且已在全局环境或使用venv
安装了semver包(如果缺少,请使用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
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
dry_run = True
设置为不实际删除就获取要删除的日志。输出将如下所示: update /org/projectlombok/lombok
1.18.2 (newer version: 1.18.6)
1.16.20 (newer version: 1.18.6)
我花了几个小时研究这个问题和答案,很多答案都依赖于atime
(UNIX系统上的最后访问时间),但这种解决方案不可靠,有两个原因:
atime
,这是有原因的:完整实现atime
将意味着整个文件系统都会变慢,因为必须在每次读取文件时更新(即写入磁盘)atime
,而且如此频繁的更新会非常快地磨损现代高性能SSD驱动器atime
设置为“最近”的值maven-repository-cleaner.sh
有一个函数cleanDirectory
,它是一个递归函数,遍历~/.m2/repository/
并执行以下操作:
实际上,如果您有这样的层次结构:
artifact-group
artifact-name
1.8
1.10
1.2
... maven-repository-cleaner.sh
脚本将会执行以下操作:
artifact-group
目录artifact-group
目录中,进入 artifact-name
目录artifact-name
目录中,删除子文件夹 1.8
和 1.2
,因为 1.10
比 1.2
和 1.8
都要好因此,这与Andronicus和Pavan Kumar提供的解决方案非常相似,不同之处在于这个脚本是用Shell编写的。要在您的CI/CD平台(或任何其他形式的UNIX系统)上运行该工具,只需在构建开始或结束时使用下面的三行代码:
wget https://raw.githubusercontent.com/alitokmen/maven-repository-cleaner/main/maven-repository-cleaner.sh
chmod +x maven-repository-cleaner.sh
./maven-repository-cleaner.sh
bin/mvnclean
我可能会在完成更多工作后将其打包为Ruby gem,这将简化问题(gem install mvnclean; mvnclean
) 如果您已经安装并运行了Ruby。
只需清理.m2-->repository文件夹下的所有内容。当您构建项目时,所有依赖项都会加载到这里。
在您的情况下,可能您的项目早期使用了任何依赖项的旧版本,现在版本已升级。因此最好清理.m2文件夹并使用mvn clean install构建项目。
现在,具有最新版本模块的依赖项将下载到此文件夹中。
你需要复制项目所需的依赖项。
拿到这些后,请清除嵌入在<dependencies>
标签中的所有<dependency>
标签,
从你的项目的POM.XML文件中。
保存文件后,你将不会在Libraries
中看到Maven Dependencies。
然后,请粘贴之前复制的那些<dependency>
。
所需的JAR包将由Maven自动下载,你也可以在保存文件后的生成的Maven DependenciesLibraries
中看到。
谢谢。
.m2repository
文件夹即可,项目编译后会自动重新创建。 - user2339071