ChatGPT解决这个技术问题 Extra ChatGPT

Maven 找不到本地工件

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

未能在项目 X 上执行目标:无法解析项目 X 的依赖关系:在 [archiva 存储库] 中找不到 Y 已缓存在本地存储库中,直到内部的更新间隔已过或强制更新时才会重新尝试解决 - >

其中 X 是正在构建的项目,而 Y 是据称丢失的工件。如果您查看本地存储库,则工件就在那里。该工件从未安装在我们的档案存储库中,因此问题纯粹基于本地存储库。

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

似乎唯一有效的两件事是等待很长时间直到 maven 变聪明,或者完全删除本地存储库。推测等待选项与上述更新间隔有关。

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

Maven 是否在“等待”期间或之前记录任何内容?即它是否试图连接到一个无法访问的存储库?另外,有问题的工件是“-SNAPSHOT”吗?
除了我上面提到的错误之外,Maven 不会记录任何内容。是的,这是一个快照依赖项。
在尝试构建第二个项目之前,您是否安装了构建包?
我喜欢错误消息是连续出现的,而不是语法正确的句子。这样,我们不能确定它是否找不到 Y 或 Y 是否在本地缓存,或两者兼而有之。无论如何,我有一个类似的问题。我能够使用 -U 选项解决它,因为我的依赖项位于我公司的内部存储库中。为什么您需要的工件没有部署到公司的内部存储库?

C
Community

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


对我来说,这是一个名为“_remote.repositories”的文件。我删除了它,它起作用了!感谢您的技巧!
Thx 名为 _remote.repositories 的文件也存在。当我们的关系停止网络连接时发生在我身上,因此它无法获取依赖项
提供的解决方案确实有效。但是,我对为什么会出现这个问题很感兴趣。谁能给我一个快速的解释?我必须做一些不同的事情吗?
如果您想绕过此来源检查一次(不删除元文件),请尝试将 aether.enhancedLocalRepository.trackingFilename=some_dummy_file_name 传递给依赖项解析过程;最简单的方法是在调用命令中添加 -D 系统属性。
@Janothan IMO 答案中的链接提供了一个很好的解释:)
S
Sampath

由于这里的选项对我不起作用,我正在分享我是如何解决它的:

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

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


谢谢你!这让我发疯了。当我在单行上执行时, mvn clean package jboss-as:deploy 正在工作,但当我单独执行时却没有。
谢谢,这个解决方案让我免于浪费时间
D
DrB

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

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

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

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

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

这个解决方案对我有用,因为我从另一台计算机复制的依赖项在中央存储库中不可用。该命令虽然错过了几个字符。这是完整的命令: find 。 -name "_remote.repositories" -type -f -delete
或者,您应该能够通过将 -Daether.enhancedLocalRepository.trackingFilename=some_dummy_file_name 传递给进程来“误导”Maven 不查看 _remote.repositories 文件,而不是删除,而不是删除。 (没有尝试实际的 Maven 构建,但在以编程方式调用 Maven 时工作;所以前者也应该工作)
我做了这个发现并删除了 Maven 找不到的特定依赖项(jar),因为它们被列出并且可以管理到(< 10)。这是由于指向当前不可用的远程 Nexus 的错误配置(据我了解..)。因此,实际上不需要扫描所有 repo 以进行删除。无论如何,这个解决方案挽救了一天。它对我有用。
P
Paul Hicks

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

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


${user.home}\.m2\repository 是默认设置,因此删除空标签应该是一样的。
A
Andre

Maven 记得它什么时候没有找到。关键是“在内部的更新间隔过去或强制更新之前不会重新尝试解析->”

快速的解决方案是删除问题工件的本地“存储库”子目录 - 假设您已经解决了它的问题。 :)

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


如此简单的修复,很少有人注意它。 (拍)
J
Jaroslav Záruba

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


l
lupchiazoem

抓住所有。当此处提到的解决方案不起作用时(在我的情况下发生),只需从“.m2”文件夹/目录中删除所有内容,然后执行 mvn clean install


是的。这个答案有效,但 dependency:go-offline 对我不起作用。如此误导。
N
Neha Tawar

即使我遇到了这个问题并用两种方法解决了它:

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

2)否则,您可以做的是在 pom.xml 中检查您遇到错误的依赖项,并首先“mvn clean install”那些依赖项目以及您面临问题的当前项目的安装 maven 依赖项。通过这种方式,将构建本地项目的依赖项并创建 jars。


y
yuxh

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


A
Ashik Uzzaman

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


n
naXa stands with Ukraine

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


p
parsecer

发生这种情况是因为我有 http 而不是 https

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

P
Patrik Hrmo

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


该解决方案部分正确,这为我指明了正确的答案。在我的情况下,我希望 Y 成为 WAR,所以我将它打包为 JAR 和 WAR,并将 JAR 导入到项目 X 中。查看我的答案以获取详细的方法来执行此操作。
D
Dimi Ansari

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

所以在项目 Y 的 pom.xml 中,我添加了这个插件来创建一个 JAR 以及 WAR:

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

在项目 X 的 pom.xml 中添加项目 Y 的依赖项时,我必须添加一个 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。


R
Rafat Khandaker

这是问题的长期解决方案(不是快速修复,但如果没有其他解决方案将起作用)

你会因为我这么说而讨厌我,但这是关于像 eclipse 这样的开源项目的真相。因为开源是模块化的,并且允许您使用许多工具(例如 maven、spring boot、xml 或 groovy 的选项、不同的 eclipse 更新等)以多种方式构建和开发项目。问题是 eclipse 允许您运行项目缺少 maven 构建,因为 IDE 足够智能,可以使用 remote_repository 解决依赖关系,它存储和捕获项目上未正确构建的 jar 文件。

由于此功能,您实际上可能有本地构建问题,但就像 DNS 服务器一样;如果在本地目录中找不到解决方案,Eclipse 将在其远程缓存存储库中寻找解决方案。当您删除 remote_repository 并让 Maven 第二次重建它时,该项目最终可能会产生更多错误并且不会再次构建,或者可能会重建丢失的缓存。但这不太可能。

因此,解决您的解决方案的长答案。

这是一个项目架构问题!

解决方案:您需要做的是查看所有依赖项目的 pom.xml 文件和本地项目中的 maven 依赖项文件夹,并尝试解决 maven 依赖项文件夹中所有缺少的依赖项 jar。如果您有引用的库,我建议将这些 jar 移动到本地项目的 maven 依赖文件夹中。

您必须努力解决每个子项目,然后导航到您的根项目并使用 Maven -> Build -> 全新安装(检查“跳过测试”和“解决工作区工件”)修复每个项目,直到每个项目建立了一个干净的成功。

最有可能的是,当您强制更新您的所有项目的整个解决方案时,您将获得 IDE 自动解决的错误列表。自动解决将指的是解决问题的简单参考。但是要部署,您必须手动修复项目,因为 Eclipse、Spring 和 Maven 可以很好地协同工作,但可能有一些他们不同意的事情。因此,您必须在这些情况下扮演外交官并弄清楚。

这就是可悲的事实。

总而言之,我的项目中有一个问题清单。我有这个问题。生成的war文件有空的jar文件夹,除非我强制它,否则构建不是干净的没有错误。 WAR 文件生成将在 tomcat 服务器生产上运行 404 错误,并且我的 Angular 应用程序将在执行 API 时抛出 Cors-Error。

我的前端项目中的所有错误都是人为的,因为所有问题的根源都是生成的 WAR 文件。它没有生成依赖项,主项目没有在 tomcat 中执行,并且 tomcat 服务器无法运行 spring 初始化程序以在服务器上部署 cors-policy 以允许我的 Angular 应用程序进行通信。但总而言之,开发环境运行良好,没有任何问题。

这就是我对这个线程的长期解决方案。


E
EdmundSS

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


这个答案作为评论可能会更好,因为它不是问题的直接答案。
H
Hitesh Sahu

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

mavenCentral()
mavenLocal()