你如何清除 Apache Maven 的缓存?

Posted

技术标签:

【中文标题】你如何清除 Apache Maven 的缓存?【英文标题】:How do you clear Apache Maven's cache? 【发布时间】:2011-11-16 12:53:07 【问题描述】:

最近,Apache Maven 似乎遇到了缓存问题。使用 Windows Vista 或 Windows 7 对我们的项目执行全新安装有时会生成与先前构建具有相同数据的工件,即使较新的工件的文件应该已更新。

有没有办法清除这个缓存来强制 maven 总是触发一个干净的构建应该构建的本地工件?

特别是,我们在使用 war 插件构建 web 应用时遇到了问题。 Maven 版本是 3.0.3。战争插件版本是2.1.1。

【问题讨论】:

您是否尝试过 -U 标志来更新工件? 你能提供更多细节吗?家属在战争中没有得到更新吗?如果有,家属是否有 SNAPSHOT 版本? 它是一个多模块项目吗?你检查过依赖模块的版本号吗?你能重现吗? mvn clean install 将新工件放入本地存储库? @MetroidFan2002 我们可以在这里给一个标记的答案。或者,如果您自己找到任何解决方案,您也可以编写解决方案。 mvn clean install -Dmaven.repo.local=/alternate/repo/location 【参考方案1】:

这适用于 Spring Tool Suite v 3.1.0.RELEASE,但我猜它也适用于 Eclipse。

/username/.m2 目录中手动删除工件(如上面 palacsint 所述)后,通过执行以下操作重新索引文件:

转到:

Windows->Preferences->Maven->User Settings 菜单。

单击Local Repository 文本框旁边的Reindex 按钮。点击“应用”然后“确定”就完成了。

【讨论】:

【参考方案2】:

如果您将 maven 插件作为模块之一,请使用 mvn dependency:purge-local-repository -DactTransitively=false -Dskip=true。否则 Maven 将尝试重新编译它们,从而再次下载依赖项。

【讨论】:

这实际上是我正在寻找的,它只是有一个错字(缺少用于跳过的破折号): mvn dependency:purge-local-repository -DactTransitively=false -Dskip=true【参考方案3】:

我也遇到过同样的问题,我在 shell 中写了一个单行代码来解决这个问题。

rm -rf $(mvn help:evaluate -Dexpression=settings.localRepository\
                       -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN -B \
                       -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn | grep -vF '[INFO]')/*

我这样做是因为我希望有一个 Jenkins 项目,以便在我需要的时候简单地运行它,这样我就不必登录到东西等。 如果你允许自己为它编写一个 shell 脚本,你可以把它写得更干净:

#!/usr/bin/env bash
REPOSITORY=$(mvn help:evaluate \
  -Dexpression=settings.localRepository \
  -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
  -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \
  --batch-mode \
  | grep -vF '[INFO]')

rm -rf $REPOSITORY/*

应该可以,但我还没有测试所有的脚本。 (我已经测试了第一个命令,但没有测试整个脚本。)这种方法的缺点是首先运行一个大而复杂的命令。它是幂等的,所以你可以自己测试一下。删除之后是它自己的命令,这让您可以尝试一切并检查它是否按照您的想法执行,因为您不应该在没有验证的情况下信任删除命令。然而,它之所以聪明有一个很好的理由:它是便携的。它尊重您的 settings.xml 文件。如果您正在运行此命令,并告诉 maven 使用特定的 xml 文件(-s 或 --settings 参数),这仍然有效。因此,您不必费心确保所有地方的一切都相同。

这有点笨拙,但这是一种不错的经商方式,IMO。

【讨论】:

【参考方案4】:

所以有一些命令可以用来清理

 1. mvn clean cache   
 2. mvn clean install 
 3. mvn clean install -Pclean-database

从 .m2 中删除存储库文件夹也会有所帮助。

【讨论】:

“mvn clean cache”应该做什么?对我来说,这似乎不是一个公认的命令。 使用 maven 3.6.0:Unknown lifecycle phase "cache". 你从哪里得到这个命令?【参考方案5】:

手动从c:\Users\<username>\.m2\repository 中删除工件(或完整的本地存储库)。

【讨论】:

已经试过了,还是不行。不过感谢您的建议。 看起来,即使在重新启动后,大量的 Maven 工件都有句柄:The action can't be completed because the folder or file in it is open in another program. Close the folder or file and try again. 请注意,文件夹位置可能因您的系统而异 - 请参阅 this answer 了解如何获取 maven repo 文件夹路径 @liltitus27 也一样,只是清除 ~/.m2/repository 没有用,mvn dependency:purge-local-repository 终于成功了 是的,这对我来说 100% 有效 - Windows10 在公司网络上作为用户而不是管理员【参考方案6】:

正如一些答案所指出的,有时您真的想完全删除本地存储库,例如,可能有一些工件无法清除,因为它们不再被pom.

如果您想将此删除嵌入到 maven 阶段,例如 clean,您可以使用 maven-clean-plugin 并通过设置访问存储库,例如:

 <plugin>
    <inherited>false</inherited>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <phase>clean</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <echo>Base clean is attached to deleting local maven cache</echo>
                    <echo>$settings.localRepository</echo>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <inherited>false</inherited>
    <artifactId>maven-clean-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <filesets>
            <fileset>
                <directory>$settings.localRepository</directory>
            </fileset>
        </filesets>
    </configuration>
</plugin>

【讨论】:

【参考方案7】:

我会做以下事情:

mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end

这些标志告诉 maven 不要尝试解决依赖关系或访问网络。 删除你在本地看到的内容。

为了更好地衡量,请忽略错误 (--fail-at-end) 直到最后。这有时对于具有一些混乱的依赖项或依赖于一些混乱的内部存储库的项目很有用(它确实发生了。)

【讨论】:

这样的清理,仅仅删除本地缓存文件夹还不够吗? 如果你知道每一个传递依赖,你就可以做到。但是随后它变得乏味(或者我们可以删除整个缓存,但这将迫使 maven 再次下载与所讨论的工件无关的所有内容。)这完全取决于具体情况。【参考方案8】:

要清理本地缓存,请尝试使用依赖插件。

    mvn dependency:purge-local-repository:这是尝试删除本地存储库文件,但它总是会在删除内容后填满本地存储库。 mvn dependency:purge-local-repository -DreResolve=false:这避免了重新解析依赖关系,但有时似乎仍会进入网络。 mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false:这是由 Paweł Prażak 添加的,似乎运行良好。如果你想清空本地 repo,我会使用第三个,如果你只想扔掉本地 repo 并再次获取依赖项,我会使用第一个。

【讨论】:

从 linux 系统上的命令行。您将需要安装 mvn。 maven.apache.org/install.html 我会补充一点,您可以使用附加参数定位特定组/工件。这个答案绝对是我想要的(选项 3)。这是那个额外的参数 ::: mvn dependency:purge-local-repository -DmanualInclude="myGroupId" -DsnapshotsOnly=true -DactTransitively=false -DreResolve=false 我尝试了第三个选项,目的是删除 本地存储库 中的所有内容,但它不起作用 - 直到此时,实现此目标的唯一方法是手动删除该目录的所有内容。我的 本地存储库&lt;User_Name&gt;/.m2 位置不同。不知道是不是这个原因。【参考方案9】:

您是否检查/更改了 settings.xml 中您的存储库的 updatePolicy 设置。

此元素指定尝试更新的频率。 Maven 将比较本地 POM 的时间戳(存储在存储库的 maven-metadata 文件)到远程。选择是:总是,每天 (默认),interval:X(其中 X 是以分钟为单位的整数)或从不。

尝试将其设置为always

【讨论】:

可能有助于处理这个问题...我的 pom.xml 中没有 &lt;updatePolicy&gt;,但有 &lt;snapshotPolicy&gt; updatePolicy 在我的 settings.xml 中设置为始终无处不在。

以上是关于你如何清除 Apache Maven 的缓存?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Grails 命令/SDK 中清除 Maven 缓存?

如何清除 Apache 中的所有缓存?

IDEA强制清除Maven缓存

apache缓存如何清理

怎样清除Gradle,Maven多余的依赖包等缓存文件

怎样清除Gradle,Maven多余的依赖包等缓存文件