如何清除Apache Maven的缓存?

276

最近,Apache Maven 似乎存在缓存问题。在使用 Windows Vista 或 Windows 7 进行干净的项目安装时,有时会生成与之前构建的构件相同数据的构件,尽管新构件的文件应该已经更新。

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

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


6
你尝试过使用 -U 标志更新构件吗? - Amir Raminfar
3
能否提供更多细节?受扶养人在战争中未被更新吗?如果是这样,受扶养人是否有快照版本? - Raghuram
1
这是一个多模块项目吗?您是否检查了依赖模块的版本号?您能否重现问题?运行 mvn clean install 命令将新产物放入本地仓库中吗? - palacsint
@MetroidFan2002,我们能否在这里标记一个答案。或者如果您自己找到了解决方案,也可以编写一个解决方案。 - Naman
1
mvn clean install -Dmaven.repo.local=/alternate/repo/location - Gayan Weerakutti
11个回答

280

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


4
尝试过了,没用。还是谢谢你的建议。 - MetroidFan2002
3
重新启动后,似乎仍有大量Maven工件与之相关:由于文件夹或其中的文件在另一个程序中打开,因此无法完成操作。请关闭该文件夹或文件并重试。 - liltitus27
2
请注意,文件夹位置可能因您的系统而异 - 有关如何获取Maven存储库文件夹路径,请参见此答案 - jakub.g
15
@liltitus27说:“我也一样,仅仅清空~/.m2/repository并没有起作用,最终运行mvn dependency:purge-local-repository解决了问题。” 我的翻译如下:“@liltitus27和你有相同的问题,他尝试过清空“~/.m2/repository”,但这并没有解决问题。最终,他通过运行命令“mvn dependency:purge-local-repository”成功解决了问题。” - qbert65536
@KorayTugay 可能正在使用内部捆绑的Gradle分发。许多工具都这样做,令人恼火。 IntelliJ IDEA就是其中之一。 - rath
显示剩余2条评论

219

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

  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添加的,似乎效果很好。如果要清空本地仓库,则使用第三个;如果只想摆脱本地仓库并获取依赖项,则使用第一个。

在Linux系统的命令行中,您需要安装mvn。http://maven.apache.org/install.html - Brian C.
我要补充一下,你可以通过额外的参数来针对特定的组/构件进行操作。这个答案绝对是我想要的(选项3)。以下是额外的参数::: mvn dependency:purge-local-repository -DmanualInclude="myGroupId" -DsnapshotsOnly=true -DactTransitively=false -DreResolve=false。 - granadaCoder
我尝试了第三个选项,目的是删除_local repository_中的所有内容,但它不起作用 - 到目前为止实现此目标的唯一方法是手动删除该目录中的所有内容。我的_local repository_位于与<User_Name>/.m2位置不同的位置。不确定是否会是原因。 - Manuel Jordan

17

我会做以下几件事:

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

这些标志告诉 Maven 不要尝试解析依赖项或访问网络。请删除本地可见的内容。

为了保险起见,直到最后忽略错误(--fail-at-end)。这对于那些拥有一组有点混乱的依赖关系或依赖于有点混乱的内部存储库的项目非常有用(这种情况经常发生)。


1
仅仅删除本地缓存文件夹就足以进行这种清理吗? - user285372
1
如果你知道每一个传递依赖,那么你是可以这样做的。但是这会变得很繁琐(或者我们可以删除整个缓存,但这将强制Maven重新下载与所讨论的构件无关的所有内容)。这完全取决于具体情况。 - luis.espinal

14
你是否已经检查/更改了你的仓库在settings.xml中的updatePolicy设置?
这个元素指定了更新尝试发生的频率。Maven会比较本地POM的时间戳(存储在仓库的maven-metadata文件中)和远程仓库的时间戳。可选项有: 总是(always), 每天(daily,缺省), 每隔X分钟内更新(interval:X,X为整数), 或者从不更新(never)。
请尝试将其设置为always

1
为处理此问题提供可能的帮助… 我的pom.xml中没有<updatePolicy>,但有<snapshotPolicy> - Al Lelopath
我的settings.xml中updatePolicy已经设置为always everywhere。 - MasterJoe

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

7

我很惊讶还没有人提到它

mvn clean install -U

-U 标志告诉 Maven 在不使用本地缓存的情况下获取所有依赖项的最新副本。


1
这个命令帮助了我。 - divine
删除出现错误的特定仓库并没有起作用。但是这个方法有效! - undefined

6

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

按照palacsint的说法,手动删除/username/.m2目录中的构件后,通过以下方式重新索引文件:

前往:

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

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


1
我没有看到这样的按钮。 - undefined

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>

0

我同意使用mvn clean install -U作为第一选择。你不需要清空整个本地仓库。


-1

我曾经遇到过这个问题,然后我在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参数),它仍然可以工作。所以你不必费心确保所有东西都在各处相同。

虽然有点笨重,但我认为这是一个不错的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接