最近,Apache Maven 似乎存在缓存问题。在使用 Windows Vista 或 Windows 7 进行干净的项目安装时,有时会生成与之前构建的构件相同数据的构件,尽管新构件的文件应该已经更新。
是否有任何方法可以清除此缓存,以便强制 Maven 始终触发本地应该构建的干净构建工作?
特别是,在使用 war 插件构建 web 应用程序时,我们遇到了问题。 Maven 版本为 3.0.3。 War 插件版本为 2.1.1。
手动从 c:\Users\<username>\.m2\repository
删除构件(或整个本地仓库)。
由于文件夹或其中的文件在另一个程序中打开,因此无法完成操作。请关闭该文件夹或文件并重试。
- liltitus27mvn dependency:purge-local-repository
解决了问题。” 我的翻译如下:“@liltitus27和你有相同的问题,他尝试过清空“~/.m2/repository”,但这并没有解决问题。最终,他通过运行命令“mvn dependency:purge-local-repository”成功解决了问题。” - qbert65536为了清除本地缓存,请尝试使用依赖插件。
mvn dependency:purge-local-repository
: 这是一种尝试删除本地仓库文件的方法,但是在删除后总是会重新填充本地仓库。mvn dependency:purge-local-repository -DreResolve=false
: 这避免了重新解析依赖关系,但有时似乎仍会访问网络。mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false
: 这是Paweł Prażak添加的,似乎效果很好。如果要清空本地仓库,则使用第三个;如果只想摆脱本地仓库并获取依赖项,则使用第一个。<User_Name>/.m2
位置不同的位置。不确定是否会是原因。 - Manuel Jordan我会做以下几件事:
mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end
这些标志告诉 Maven 不要尝试解析依赖项或访问网络。请删除本地可见的内容。
为了保险起见,直到最后忽略错误(--fail-at-end
)。这对于那些拥有一组有点混乱的依赖关系或依赖于有点混乱的内部存储库的项目非常有用(这种情况经常发生)。
settings.xml
中的updatePolicy设置?always
。<updatePolicy>
,但有<snapshotPolicy>
。 - Al Lelopathmvn dependency:purge-local-repository -DactTransitively=false -Dskip=true
。否则,Maven将尝试重新编译它们,从而再次下载依赖项。我很惊讶还没有人提到它
mvn clean install -U
-U
标志告诉 Maven 在不使用本地缓存的情况下获取所有依赖项的最新副本。
这适用于Spring Tool Suite v 3.1.0.RELEASE,但我猜测它也适用于Eclipse。
按照palacsint的说法,手动删除/username/.m2
目录中的构件后,通过以下方式重新索引文件:
前往:
Windows->Preferences->Maven->User Settings
菜单。点击Local Repository
文本框旁边的Reindex
按钮。 点击“应用”然后“确定”,完成。
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>
我同意使用mvn clean install -U
作为第一选择。你不需要清空整个本地仓库。
我曾经遇到过这个问题,然后我在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参数),它仍然可以工作。所以你不必费心确保所有东西都在各处相同。
虽然有点笨重,但我认为这是一个不错的做法。
-U
标志更新构件吗? - Amir Raminfarmvn clean install
命令将新产物放入本地仓库中吗? - palacsintmvn clean install -Dmaven.repo.local=/alternate/repo/location
- Gayan Weerakutti