【问题标题】:clean up and maintain local maven cached artifact in .m2清理和维护 .m2 中的本地 maven 缓存工件
【发布时间】:2017-11-09 17:37:34
【问题描述】:

我的 Jenkins slave 上有一个 .m2 存储库,它每天都在增长,目前接近 40 GB。

由于我有多个作业正在运行并从 .m2 中选择依赖项,因此我无法删除所有内容,但我可以看到在 .m2 的每个 repo 中都有一个旧版本且无用的人工制品。

在 maven 中是否有任何可用的方法,以便在作业触发时 $mvn install maven 将仅在 .m2 存储库中为 .m2 中的每个存储库保留最新版本(例如版本控制 xyzw 是增量的)?

【问题讨论】:

  • 第一件事永远不要与多个作业共享一个 Maven 缓存。每个作业都应该在工作区中拥有自己的缓存...
  • 如果我关心在每个构建中都会引入外部依赖项,那么 bcz 我有这样的工作吗?如下所述。
  • 第一个问题:真的每次构建都需要清理工作空间吗?这取决于。此外,如果您需要共享从一个作业构建并应该由另一个作业使用的依赖项,您应该使用存储库管理器...

标签: maven jenkins


【解决方案1】:

如果您不在乎每次构建时都会拉取外部依赖项,您可以为每个作业使用私有 Maven 存储库(Maven -> 高级 -> 选中“使用私有 Maven 存储库”)并在开始时清理工作区你的构建。私有存储库会在您的工作区中创建一个.repository,因此清理您的工作区将确保您从一个空的存储库开始。

如果您有许多共享的外部依赖项,那么您可能会使用更多的磁盘空间,因为它们在不同的存储库中多次出现。在这种情况下,您可以编写一个脚本,定期(使用像cron 这样的任务调度程序)从共享存储库中删除未使用的文件,例如this Stack Overflow answer

但是要谨慎使用共享的 Maven 存储库!默认情况下,Maven 不是线程安全的,因此下载相同工件的并发作业可能会使用不完整的下载。考虑使用 Takari extensions 使您的 Maven 存储库线程安全。

【讨论】:

  • 有趣的回复谢谢:),但我的工作基本上使用外部依赖项,比如一项工作将从不同的工作中提取依赖项。
  • 共享外部依赖是什么意思?您使用的每个依赖项都是共享的外部依赖项?我很清楚你的意思是:job is going to pull dependency artifact from different job?那么一个工作产生和另一个工作消耗的工件?那么问题出在哪里呢?
  • .m2/repository/com/tb/TbMainFolder 包含由同一作业生成的 0.0.1-SNAPSHOT 和 0.0.2-SNAPSHOT。举例说明: 0.0.1-SNAPSHOT —旧工件 0.0.2-SNAPSHOT —旧工件 ...。 ... 1.0.10-SNAPSHOT -latest artifact 所有较旧的artifact 都没有在任何地方使用,它不需要存在于.m2 中。我希望当最新的可用时,旧的artifact 应该移动到trace 或应该被删除。
  • 外部依赖项可以缓存在像nexus这样的maven存储库中,从而降低下载成本
【解决方案2】:

在遇到类似问题后,我想出了一个解决方案并将其开源,因为它可能对其他人有所帮助。该应用程序在 Github 上可用,它可以清理旧的依赖项并仅保留最新的。

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

除了清理旧的依赖项之外,它还具有其他功能,例如基于日期基于下载日期/上次访问日期的清理、删除快照、源代码、javadocs、忽略或强制执行删除特定组或工件。

此外,这是跨平台,可以在 Windows 和 Unix/Linux 环境中运行。

【讨论】:

猜你喜欢
  • 2015-11-22
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2021-06-23
  • 2020-04-02
  • 2021-02-23
  • 2017-04-23
相关资源
最近更新 更多