Maven未能找到当地的工件

时间:2012-09-20 16:44:17

标签: maven resolution

有时maven会抱怨在构建另一个将其作为依赖项的项目时,在本地存储库中找不到本地构建和打包的特定依赖项。我们收到如下错误:

  

无法在项目X上执行目标:无法解析项目X的依赖关系:未能在[archiva repository]中找到Y缓存在本地存储库中,在内部更新间隔过去或更新之前,不会重新尝试解析被迫 - >

其中X是正在构建的项目,而Y是所谓的缺失工件。如果您查看本地存储库,那么工件就在那里。此工件从未安装在我们的archiva存储库中,因此问题纯粹基于本地存储库。

我们在settings.xml中尝试了各种配置文件,当然还有“mvn -U”。没有任何好处,也不应该,因为这个工件永远不会比本地存储库更进一步。

似乎唯一有用的两件事就是等待很长时间,直到maven智能化,或完全删除本地存储库。据推测,等待选项与上述更新间隔有关。

我们在maven 3.0.2和3.0.3中遇到过这个问题。我们正在使用Archiva 1.0.3(但这不应该是一个因素)。任何帮助将不胜感激。

17 个答案:

答案 0 :(得分:56)

本地Maven仓库使用工件目录中名为“_maven.repositories”的文件跟踪工件最初来自何处。删除后,构建工作。 This answer为我解决了这个问题。

答案 1 :(得分:26)

由于此处的选项对我不起作用,我分享了我如何解决它:

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

在父目录中执行mvn install 完成了这项工作。在那之后,我可以在A里面mvn package,然后才能找到B。

答案 2 :(得分:12)

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

下面的简单shell命令会删除这些标记文件。如果您只为机器使用离线模式,则可以安全地执行此操作。 我不会在需要从网络上下载文件的计算机上执行此操作。

我在与网络断开连接的构建服务器上使用了此策略。我们必须将存储库传输到它,删除标记文件,然后以脱机模式运行。

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

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

答案 3 :(得分:7)

Maven记得什么时候找不到东西。关键是“在内部更新间隔过去或强制更新之前不会重新尝试解决方案 - >”

快速解决方案是删除问题工件的本地“repository”子目录 - 假设您已修复问题。 :)

mvn -U将强制从远程存储库更新 - 再次,假设您现在已经使用所述工件填充了远程数据库。

答案 4 :(得分:7)

当我遇到这种情况时,这是因为我从模板中盲目地复制了我的settings.xml,但它仍然有空<localRepository/>元素。这意味着在解析依赖项时没有使用本地存储库(尽管您安装的工件仍然放在默认位置)。当我用<localRepository>${user.home}\.m2\repository</localRepository>替换它时,它开始工作。

对于* nix,我想是<localRepository>${user.home}/.m2/repository</localRepository>

答案 5 :(得分:3)

如果您在pom.xml中定义了<repositories/>,则显然将忽略本地存储库。

答案 6 :(得分:0)

当我的新项目依赖于oracle jdbc jar(我已经在我的本地存储库中安装并且适用于其他项目)时,我遇到了类似的问题。我尝试了-U选项,删除.lastupdate文件或整个目录并再次下载,但它不起作用。最后,我删除了目录并再次在本地安装,它可以工作。

答案 7 :(得分:0)

我在Maven周围发现的一个错误是当我将settings.xml文件放在错误的目录中时。它必须位于用户主目录下的.m2文件夹中。检查以确保它位于正确的位置(如果您使用的话,还有settings-security.xml)。

答案 8 :(得分:0)

当我通过shell脚本安装本地工件时,我在Ubuntu Linux中有DependencyResolutionException。解决方案是删除本地工件并“手动”再次安装它们 - 通过终端调用mvn install:install-file

答案 9 :(得分:0)

即使我遇到了这个问题,也可以通过2种方法解决它:

1)在IDE中,选择项目并清理所有项目,然后通过右键单击项目安装所有maven依赖项->转到maven,然后更新项目依赖项一次选择所有项目以进行安装。完成后,运行特定项目

2)否则您可以做的是检查pom.xml中是否有错误的依赖项,并“ mvn全新安装” 那些依赖项 首先执行项目,以及遇到问题的当前项目的安装Maven依赖项。这样,将构建本地项目的依赖项并创建jar。

答案 10 :(得分:0)

全部捕获。如果此处提到的解决方案不起作用(就我而言),只需删除“ .m2”文件夹/目录中的所有内容,然后执行mvn clean install

答案 11 :(得分:0)

发生这种情况是因为我在其中使用了http而不是https

<repository>
    <id>jcenter</id>
    <name>jcenter-bintray</name>
    <url>https://jcenter.bintray.com</url>
</repository>

答案 12 :(得分:0)

检查工件Y是否将包装设置为“罐子”。如果您通过错误或复制粘贴将其定义为“ war”,它将显示此奇怪的“已缓存在本地存储库中,直到内部更新间隔到期或强制执行更新后,才会重新尝试解析”。我希望像“工件Y是战争,应该是jar类型”。

答案 13 :(得分:0)

在我的情况下,我需要将项目Y作为要通过Tomcat部署的WAR,还需要将其作为JAR才能将其添加为项目X中的依赖项。

因此,在项目Y的pom.xml中,我添加了此插件以与WAR一起创建JAR:

            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
                    <attachClasses>true</attachClasses>
                    <classesClassifier>classes</classesClassifier>
                </configuration>
            </plugin>

在将项目Y的依赖项添加到项目X的pom.xml中时,我不得不添加一个classifier

        <dependency>
            <groupId>groupId.of.project.Y</groupId>
            <artifactId>project.Y</artifactId>
            <version>1.0-SNAPSHOT</version>
            <classifier>classes</classifier>
        </dependency>

注意:构建项目Y时,将在目标文件夹中看到2个包装:project-Y.warproject-Y-classes.jar,因此这就是在导入时指定要导入的classes分类器的原因JAR,而不是WAR。

答案 14 :(得分:0)

就我而言,我必须在根级 gradle 依赖项中添加 mavenLocal()

mavenCentral()
mavenLocal()

答案 15 :(得分:-1)

由于不同的原因,我也有同样的错误:我创建了一个包含我们“良好实践”依赖项的入门级POM,并在本地构建和安装了它来进行测试。我可以在存储库中“看到”它,但是使用它的项目遇到了以上错误。我所做的是将启动程序POM设置为pom,因此没有JAR。 Maven非常正确,因为它不在Nexus中-但是我没想到会这样,所以错误是,嗯,没有帮助。将启动器POM更改为常规包装并重新安装可解决此问题。

答案 16 :(得分:-3)

请尝试此命令。

mvn验证