maven 偶尔会抱怨在本地构建和打包的特定依赖项在构建另一个将其作为依赖项的项目时无法在本地存储库中找到。我们收到如下错误:
未能在项目 X 上执行目标:无法解析项目 X 的依赖关系:在 [archiva 存储库] 中找不到 Y 已缓存在本地存储库中,直到内部的更新间隔已过或强制更新时才会重新尝试解决 - >
其中 X 是正在构建的项目,而 Y 是据称丢失的工件。如果您查看本地存储库,则工件就在那里。该工件从未安装在我们的档案存储库中,因此问题纯粹基于本地存储库。
我们尝试了 settings.xml 中的各种配置文件,当然还有“mvn -U”。既没有任何好处,也不应该这样做,因为这个工件永远不会比本地存储库更进一步。
似乎唯一有效的两件事是等待很长时间直到 maven 变聪明,或者完全删除本地存储库。推测等待选项与上述更新间隔有关。
我们在 maven 3.0.2 和 3.0.3 中遇到过这个问题。我们使用的是 Archiva 1.0.3(但这也不应该是一个因素)。任何帮助将不胜感激。
由于这里的选项对我不起作用,我正在分享我是如何解决它的:
我的项目有一个父项目(有自己的 pom.xml),它有许多子模块,其中一个(A)依赖于另一个子模块(B)。当我在 A 中尝试 mvn package
时,它不起作用,因为 B 无法解析。
执行 mvn install
在父目录中 完成了这项工作。之后,我可以在 A 内部执行 mvn package
,然后它才能找到 B。
即使在离线模式下,如果依赖项有 _remote.repositories 标记,maven 也会检查远程存储库。如果您需要在离线模式下操作,您可能需要删除这些文件。
下面的简单 shell 命令会删除这些标记文件。如果您只对机器使用离线模式,这样做是安全的。我不会在需要从网络上下载文件的机器上执行此操作。
我在与 Web 断开连接的构建服务器上使用了此策略。我们必须将存储库转移到它,删除标记文件,然后在离线模式下运行。
在 Linux / Unix 上,您可以通过以下方式删除远程存储库标记文件:
cd ~/.m2
find . -name "_remote.repositories" -type f -delete
-Daether.enhancedLocalRepository.trackingFilename=some_dummy_file_name
传递给进程来“误导”Maven 不查看 _remote.repositories
文件,而不是删除,而不是删除。 (没有尝试实际的 Maven 构建,但在以编程方式调用 Maven 时工作;所以前者也应该工作)
当这发生在我身上时,是因为我盲目地从模板中复制了我的 settings.xml,它仍然有空白的 <localRepository/>
元素。这意味着在解析依赖项时没有使用本地存储库(尽管您安装的工件仍然放在默认位置)。当我用 <localRepository>${user.home}\.m2\repository</localRepository>
替换它时,它开始工作。
对于 *nix,我想应该是 <localRepository>${user.home}/.m2/repository</localRepository>
。
Maven 记得它什么时候没有找到。关键是“在内部的更新间隔过去或强制更新之前不会重新尝试解析->”
快速的解决方案是删除问题工件的本地“存储库”子目录 - 假设您已经解决了它的问题。 :)
mvn -U
将强制从远程存储库更新 - 再次假设您现在已使用所述工件填充远程。
如果您在 pom.xml 中定义了 <repositories/>
,显然您的本地存储库将被忽略。
抓住所有。当此处提到的解决方案不起作用时(在我的情况下发生),只需从“.m2”文件夹/目录中删除所有内容,然后执行 mvn clean install
。
dependency:go-offline
对我不起作用。如此误导。
即使我遇到了这个问题并用两种方法解决了它:
1)在您的IDE中选择项目并清理所有项目,然后通过右键单击项目安装所有maven依赖项->转到maven并更新项目依赖项一次选择所有项目以安装相同的项目。完成后运行特定项目
2)否则,您可以做的是在 pom.xml 中检查您遇到错误的依赖项,并首先“mvn clean install”那些依赖项目以及您面临问题的当前项目的安装 maven 依赖项。通过这种方式,将构建本地项目的依赖项并创建 jars。
当我的新项目依赖于 oracle jdbc jar(我已安装在本地存储库中并且适用于其他项目)时,我遇到了类似的问题。我尝试了 -U 选项,删除 .lastupdate 文件或整个目录并再次下载,但它不起作用。最后,我删除了目录并再次在本地安装它,它可以工作。
我在 Maven 中发现的错误之一是我将 settings.xml 文件放在错误的目录中。它必须在您的用户主目录下的 .m2 文件夹中。检查以确保它位于正确的位置(如果您正在使用它,请与 settings-security.xml 一起使用)。
当我通过 shell 脚本安装本地工件时,我在 Ubuntu Linux 中有 DependencyResolutionException
。解决方案是删除本地工件并“手动”重新安装它们 - 通过终端调用 mvn install:install-file
。
发生这种情况是因为我有 http
而不是 https
:
<repository>
<id>jcenter</id>
<name>jcenter-bintray</name>
<url>https://jcenter.bintray.com</url>
</repository>
检查您的工件 Y 是否将包装设置为“jar”。如果你通过错误或复制粘贴将其定义为“战争”,它会显示这种奇怪的“已缓存在本地存储库中,直到内部更新间隔已过或强制更新后才会重新尝试解析”。我期待像“工件 Y 是战争,预期 jar 类型”之类的东西。
在我的情况下,我需要项目 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.war
和 project-Y-classes.jar
,这就是为什么在导入时指定 classes
分类器来导入 JAR 而不是 WAR。
这是问题的长期解决方案(不是快速修复,但如果没有其他解决方案将起作用)
你会因为我这么说而讨厌我,但这是关于像 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 应用程序进行通信。但总而言之,开发环境运行良好,没有任何问题。
这就是我对这个线程的长期解决方案。
由于不同的原因,我遇到了同样的错误:我创建了一个包含我们的“良好实践”依赖项的起始 POM,并在本地构建和安装它来测试它。我可以在 repo 中“看到”它,但是使用它的项目出现了上述错误。我所做的是将启动器 POM 设置为 pom,因此没有 JAR。 Maven 非常正确,它不在 Nexus 中——但我没想到会这样,所以错误是,嗯,没有帮助。将启动器 POM 更改为正常包装并重新安装解决了该问题。
就我而言,我必须在根级 gradle 依赖项中添加 mavenLocal()
mavenCentral()
mavenLocal()
不定期副业成功案例分享
aether.enhancedLocalRepository.trackingFilename=some_dummy_file_name
传递给依赖项解析过程;最简单的方法是在调用命令中添加 -D 系统属性。