您如何清除Apache Maven的缓存?


212

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

是否有任何方法可以清除此缓存,以强制Maven始终触发应构建的本地工件的干净构建?

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


2
您是否尝试过-U将更新工件的标志?
阿米尔·拉明法

2
您能提供更多细节吗?战争中的家属没有得到更新吗?如果是这样,则家属是否具有SNAPSHOT版本?
拉古拉姆

它是一个多模块项目吗?您是否检查了依赖模块的版本号?你能复制吗?mvn clean install将新工件放入本地存储库?
palacsint 2011年

@ MetroidFan2002我们可以在这里给出明显的答案吗?或者,如果您自己找到了解决方案,则可以编写解决方案。
纳曼

1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

Answers:


225

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


4
已经尝试过了,没有用。(还是)感谢你的建议。
MetroidFan2002 2011年

3
看起来,即使重新启动后,许多行家文物也能应付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.
自如

1
请注意,文件夹位置可能在您的系统上有所不同- 有关如何获取Maven
Repo

9
@ liltitus27还是一样,只是抹去〜/ .m2 /储存库没有用,mvn dependency:purge-local-repository终于用了
qbert65536

是的,这对我有用100%-Windows10在企业网络上以用户身份而不是管理员
Graeme Phillips

176

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

  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所添加的,似乎效果很好。如果您要清空本地存储库,则使用第三个,如果您只想丢弃本地存储库并再次获取依赖项,则使用第一个。

4
他们之间有什么区别?
Pieter De Bie

13
第一种是尝试删除本地存储库文件的尝试,但是它总是会在删除内容后继续运行并填充本地存储库。第二个避免了重新解析依赖关系,但有时仍会进入网络。第三位由PawełPrażak添加,似乎运行良好。如果要清空本地存储库,我将使用第三个,如果只想丢弃本地存储库并再次获取依赖项,则使用第一个。
Brian C.

从Linux系统上的命令行。您将需要安装mvn。maven.apache.org/install.html
Brian C.

我还要补充一点,您可以使用其他参数来定位特定的组/工件。这个答案肯定是我想要的(选项3)。这是额外的参数::: mvn依赖项:purge-local-repository -DmanualInclude =“ myGroupId” -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder

我尝试了第3个选项,目的是删除本地存储库中的所有内容,但是它不起作用-直到这一点,实现此目标的唯一方法是手动删除该目录的所有内容。我将本地存储库放置在与位置不同的<User_Name>/.m2位置。不知道这是否是原因。
曼努埃尔·乔丹

13

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

该元素指定应该尝试进行更新的频率。Maven会将本地POM的时间戳(存储在存储库的maven-metadata文件中)与远程进行比较。选项包括:始终,每天(默认),间隔:X(其中X是分钟数的整数)或从不。

尝试将其设置为always


1
可能的处理方法…… <updatePolicy>我的pom.xml中没有,但是有<snapshotPolicy>
Al Lelopath

在我的settings.xml中,updatePolicy始终设置为始终。
MasterJoe2

11

我将执行以下操作:

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

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

最好还是不要忽略错误(--fail-at-end)。对于有时具有一些混乱的依赖性集合或依赖于有些混乱的内部存储库的项目,有时这很有用(确实如此)。


1
仅仅删除本地缓存文件夹进行这种清理还不够吗?

1
如果您知道每一个传递依赖关系,都可以。但是,这变得很乏味(或者我们可以删除整个缓存,但这将迫使maven重新下载所有文件以用于与所讨论的工件无关的事情。)这一切都取决于具体情况。
luis.espinal

6

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

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

去:

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

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


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>

2

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


1
这实际上是我正在寻找的内容,它只是有一个错字(跳过时用了破折号):mvn依赖项:purge-local-repository -DactTransitively = false -Dskip = true
shoguren

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。


-3

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

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

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


1
“ MVN清除缓存”应该做什么?对于我来说,这似乎不是公认的命令。
-AMTerp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.