你如何清除Apache Maven的缓存?

时间:2011-09-13 21:10:21

标签: apache maven

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

有没有办法清除此缓存以强制maven始终触发应该构建的本地工件的干净构建?

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

9 个答案:

答案 0 :(得分:184)

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

答案 1 :(得分:152)

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

  1. mvn dependency:purge-local-repository:这是尝试删除本地存储库文件,但它总是在删除后删除本地存储库。
  2. mvn dependency:purge-local-repository -DreResolve=false:这可以避免重新解析依赖关系,但有时似乎仍然会进入网络。
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false:这是由PawełPrażak添加的,似乎效果很好。如果你想要本地仓库清空,我会使用第三个,如果你只想丢弃本地仓库并再次获得依赖关系,我会使用第一个。

答案 2 :(得分:12)

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

  

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

尝试将其设置为always

答案 3 :(得分:8)

我会做以下事情:

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

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

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

答案 4 :(得分:6)

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

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

转到Windows-&gt;偏好设置 - &gt; Maven-&gt;用户设置菜单。

单击“本地存储库”文本框旁边的“重新索引”按钮。单击“应用”,然后单击“确定”,即可完成。

答案 5 :(得分:2)

正如一些答案所指出的那样,有时您确实真的想完全删除,例如,可能有一些无法清除的工件,因为它们不再被引用。 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>

答案 6 :(得分:2)

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

答案 7 :(得分:0)

因此,有些命令可用于清理

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

还可以从.m2删除存储库文件夹。

答案 8 :(得分:0)

我也遇到过同样的问题,我在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。