Maven无法找到本地构件

148

偶尔,Maven会抱怨找不到一个特定的依赖项,即使该依赖项已在本地构建和打包,并在另一个项目中作为依赖项进行构建。我们会遇到以下错误:

在构建X项目时执行目标失败:无法解析X项目的依赖关系:在本地存储库中缓存了在[archiva repository]中找不到Y的结果,除非内部的更新间隔已过期或强制更新,否则不会重新尝试解决依赖项->

其中,X是正在构建的项目,Y是被认为丢失的工件。如果您查看本地存储库,则会发现这个工件在那里。这个工件从来没有安装在我们的Archiva存储库中,因此问题纯粹基于本地存储库。

我们已经尝试了各种设置.xml文件中的配置文件以及"mvn -U"命令。 但都无济于事,也应该如此,因为该工件永远不会超出本地存储库。

似乎唯一有效的两个方法是等待很长时间,直到Maven变得聪明起来,或完全删除本地存储库。 前面的等待选项可能与前述的更新间隔有关。

我们在Maven 3.0.2和3.0.3中遇到了这个问题。 我们正在使用Archiva 1.0.3(但这不应该是一个因素)。如有帮助,将不胜感激。


1
Maven 在“等待”期间或刚刚在记录日志吗?即,它是否正在尝试连接到无法访问的存储库?此外,这些有问题的构件是否为“-SNAPSHOT”? - noahlz
1
请参见https://dev59.com/3HM_5IYBdhLWcg3wgzZl。 - noahlz
1
在尝试构建第二个项目之前,您是否已安装构建包? - khmarbaise
3
我喜欢错误信息是一个长句而不是语法正确的句子。这样,我们无法确定它是找不到Y还是Y被本地缓存了,或者两者都有。不管怎样,我遇到了类似的问题。我能够通过使用“-U”选项解决它,因为我的依赖项确实在公司的内部仓库中。为什么你需要的构件没有部署到公司的内部仓库? - jyoungdev
对于这些问题,检查你是否正在寻找正确的版本总是值得的。您可以使用 mvn dependency:resolve(https://maven.apache.org/plugins/maven-dependency-plugin/resolve-mojo.html)来检查特定的依赖项是否可用,并使用 mvn help:effective-pom 查看 pom 在 maven 运行时的状态,即包括从父 pom 继承的所有内容等(https://maven.apache.org/plugins/maven-help-plugin/effective-pom-mojo.html)。 - Conan
显示剩余2条评论
17个回答

110
本地Maven仓库通过在构件目录中使用名为“ _maven.repositories”的文件来跟踪构件的原始来源。 删除该文件后,构建成功。 对我有帮助的是此答案

39
对我来说,它是一个名为"_remote.repositories"的文件。我将其删除后,它就起作用了!感谢这个技巧! - perbellinio
2
谢谢,文件名为"_remote.repositories"的文件也存在。当我们的Nexus停止网络连接以至于无法获取依赖项时,我也遇到了这个问题。 - cabaji99
2
提供的解决方案确实有效。但是,我对为什么会出现这个问题很感兴趣。有人能给我一个快速的解释吗?我需要做些不同的事情吗? - Janothan
如果您想要一次性绕过此起源检查(而不删除元文件),请尝试将 aether.enhancedLocalRepository.trackingFilename=some_dummy_file_name 传递给依赖项解析过程;最简单的方法是向调用命令添加一个 -D 系统属性。 - Janaka Bandara
1
@Janothan,我觉得答案中提供的链接已经给出了非常好的解释 :) - Janaka Bandara
显示剩余3条评论

61

由于这里的选项对我没有用,所以我想分享一下我的解决方法:

我的项目有一个父项目(有其自己的pom.xml),其中有许多子模块,其中一个(A)依赖于另一个子模块(B)。当我在A中尝试执行mvn package时,它无法工作,因为无法解析B。

在父目录中执行mvn install就行了。之后,我可以在A中执行mvn package,然后才能找到B。


3
谢谢!这让我感到十分困扰。当我在一条命令行中执行 "mvn clean package jboss-as:deploy" 时,它可以工作,但是当我将它们分开执行时就不行了。 - PMorganCA
谢谢,这个解决方案让我免去了浪费时间的烦恼。 - Skywarp
如果我没有在重构期间故意破坏父项目,现在正在尝试逐个使各个组件正常工作。有人曾经弄清楚了为什么构建父级是获取预期的存储库查找的唯一方法吗? - Rick Moritz

26

即使在离线模式下,Maven 也会检查依赖项的 _remote.repositories 标记是否存在于远程仓库中。如果您需要在离线模式下操作,则可能需要删除这些文件。

以下简单的 shell 命令将删除这些标记文件。如果您只在本机使用离线模式,则可以放心执行此操作。 但是,如果需要从网络上下载文件的机器,请不要这样做。

我曾在与网路断开连接的构建服务器上使用过此策略。我们必须将存储库转移到该服务器上,删除标记文件,然后在离线模式下运行。

在 Linux / Unix 上,您可以通过以下方式删除远程存储库标记文件:

cd ~/.m2
find . -name "_remote.repositories" -type f -delete

1
这个解决方案对我很有用,因为我从另一台电脑复制了一个依赖项,该依赖项在中央仓库中不可用。但是,该命令缺少一些字符。以下是完整的命令:find . -name "_remote.repositories" -type -f -delete。 - Hans Deragon
2
或者,你可以通过传递 -Daether.enhancedLocalRepository.trackingFilename=some_dummy_file_name 给 Maven 进程来“误导” Maven 不查看 _remote.repositories 文件,而不是删除它。(没有在实际的 Maven 构建中尝试过,但在以编程方式调用 Maven 时有效;因此前者也应该有效) - Janaka Bandara
1
我通过查找和删除Maven未找到的特定依赖项(jars)来解决了这个问题,因为它们被列出并且可管理(<10)。这是由于错误配置指向当前不可用的远程Nexus引起的(据我所知...)。因此,实际上没有必要扫描整个存储库进行删除。无论如何,这个解决方案拯救了当天。它对我很有效。 - Diego1974

13

Maven会记住它未找到某些东西的情况,关键是"resolution will not be reattempted until the update interval of internal has elapsed or updates are forced ->"

解决方法是删除本地 "repository" 子目录中的有问题的构建文件,前提是已经修复了该问题。:)

mvn -U将强制从远程存储库更新 - 假设您已经在远程存储库中添加了所需构建文件。


如此简单的修复,却没有多少注意力被付出。(鼓掌) - Darek

12
当我遇到这个问题时,原因是我盲目地从一个模板中复制了我的settings.xml文件,而它仍然有空白的<localRepository/>元素。这意味着在解决依赖关系时不会使用本地存储库(尽管您安装的工件仍会被放置在默认位置)。当我用<localRepository>${user.home}\.m2\repository</localRepository>替换它后,它开始工作了。
对于*nix系统,应该是<localRepository>${user.home}/.m2/repository</localRepository>

7
${user.home}.m2\repository 是默认设置,因此删除空标签应该能够正常工作。 - LMC

9

如果您在pom.xml文件中定义了<repositories/>,那么显然会忽略您的本地仓库。


3

全捕获。当这里提到的解决方法不起作用(在我的情况下发生),只需删除“ .m2”文件夹/目录中的所有内容,然后执行mvn clean install


是的,这个答案有效,但是dependency:go-offline对我没有用。太误导人了。 - djangofan

2
我也遇到过这个问题,并用两种方法解决了它:
1)在您的IDE中选择项目并清理所有项目,然后通过右键单击项目安装所有Maven依赖项 -> 转到Maven并更新项目依赖项,一次选择所有项目以安装相同的依赖项。完成此操作后,运行特定项目。
2)或者您可以检查pom.xml中的依赖项,以获取您正在出现错误的依赖项,并首先“mvn clean install”那些依赖的项目,然后在当前项目中安装Maven依赖项。通过这样做,本地项目的依赖关系将被构建并创建jars。

0

我在Ubuntu Linux上通过shell脚本安装本地构件时遇到了DependencyResolutionException。解决方案是删除本地构件,然后通过终端手动调用mvn install:install-file重新安装它们。


0
当我的新项目依赖于Oracle JDBC jar时(我已经在本地仓库中安装并且对其他项目有效),我遇到了类似的问题。我尝试了-U选项,删除.lastupdate文件或整个目录并重新下载,但都没有起作用。最后,我删除了该目录并再次在本地安装,它就可以工作了。

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