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"以进行"干运行".
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
Run Code Online (Sandbox Code Playgroud)将您的本地 Maven 存储库移动到临时位置
mv ~/.m2 ~/saved-m2
Run Code Online (Sandbox Code Playgroud)将保存的存储库中的所有文件 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)要将本地存储库的修改副本设置为镜像,请使用以下内容创建目录 ~/.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)再次解决您的项目依赖项:
find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
Run Code Online (Sandbox Code Playgroud)现在您拥有了最少必要工件的本地 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)
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包已安装到您的全局环境中或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
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上找到。
归档时间: |
|
查看次数: |
112702 次 |
最近记录: |