如何清除Apache的maven缓存?

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

有没有办法清除这个缓存,迫使maven总是触发应该构建的本地工件的干净构建?

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

428880 次浏览

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

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

该元素指定更新尝试发生的频率。 Maven将比较本地POM的时间戳(存储在存储库中) maven-元数据文件)到远程。选择是:总是,每天

.(默认值),间隔:X(其中X为整数,单位为分钟)或从不

尝试将其设置为always

这适用于Spring Tool Suite v 3.1.0。RELEASE,但是我猜它也可以在Eclipse上使用。

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

至:

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

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

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

  1. mvn dependency:purge-local-repository:这是一个删除本地存储库文件的尝试,但它总是在东西被删除后填充本地存储库。
  2. mvn dependency:purge-local-repository -DreResolve=false:这避免了依赖关系的重新解析,但似乎有时仍然会去网络。
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false:这是由paweowpraavak添加的,似乎工作得很好。如果你想清空本地回购,我会使用第三个,如果你只想抛出本地回购并再次获得依赖项,我会使用第一个。

我会做以下几点:

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

标志告诉maven不要尝试解析依赖项或攻击网络。删除您在本地看到的内容。

为了更好地衡量,忽略错误(--fail-at-end)直到最后。这有时对于依赖项集有点混乱或依赖于有点混乱的内部存储库(这种情况时有发生)的项目很有用。

正如一些回答指出的那样,有时你真的想完全删除本地存储库,例如,可能有一些工件不能被清除,因为它们不再被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>

这里有一些命令可以用于清理

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

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

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

我也遇到过同样的问题,我在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参数),这仍然可以工作。所以你不需要确保所有地方都是一样的。

这有点笨拙,但在我看来,这是一种体面的做生意方式。