Maven:无法读取构件描述符。

334

我希望有人能够帮助我解决一个困扰我的问题。

当我尝试从终端构建项目时,出现了以下错误:

Failed to read artifact descriptor for com.morrislgn.merchandising.common:test-data-utils:jar:0.3b-SNAPSHOT: Could not find artifact com.morrislgn.merchandising:merchandising:pom:0.3b-SNAPSHOT

这个common.test-data-utils的jar包是由另一个项目创建并在此项目和另一个项目之间共享(另一个项目也无法构建,但这是另一个问题)。

我能够顺利地构建 com.morrislgn.merchandising.common:test-data-utils,我可以在我的机器上的.m2本地仓库中看到它所做的条目。我还在Eclipse中重新索引了我的仓库。

我的项目的POM文件中有以下条目:

<dependency>
    <groupId>com.morrislgn.merchandising.common</groupId>
    <artifactId>test-data-utils</artifactId>
    <version>0.3b-SNAPSHOT</version>
</dependency>

这对我来说似乎是正确的 - 当在Eclipse中查看POM时,也没有报告任何错误。

有人能告诉我在这里我错过了什么或者做错了什么吗?


5
如果某人(例如我)因为Maven>3.8.1中的HTTP存储库而遇到了此错误,类似于maven-default-http-blocker(http://0.0.0.0/):Blocked mirror for repositories:,请查阅此链接:https://dev59.com/jlEG5IYBdhLWcg3wX731 - aksh1618
@aksh1618 谢谢。那是解决我的问题的方法。 - Shreehari
25个回答

8
通过shell进入您的项目文件夹,并运行以下命令:
mvn -U clean install

通常这应该已经解决了您的问题。
如果您看到类似以下消息:
“无法解析项目 :war:0.0.1-SNAPSHOT 的依赖项: 在收集依赖项时失败,com.sun.jersey:jersey-server:jar:1.9”
那么请执行:
export MAVEN_OPTS=-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2

接下来是:

mvn -U clean install

再次更新您的依赖项以完成更新。

之后执行清理Maven构建:

maven clean install

8

“Failed to read artifact descriptor”问题通常表示Maven存储库中依赖的pom文件存在问题。建议您仔细检查pom文件的名称是否与Maven期望的名称相同,并检查pom文件内容是否有效。


1
检查pom.xml非常有用。我发现我重复了同一个依赖项(复制和粘贴错误)。清理后一切都很好。 - Adam Bogdan Boczek

7

I have a project

 A/
 |--a1
 |--a2

现在我们组织中有另一个项目。

 B/
 |--b1
 |--b2
 |--b3

每个模块a1、b1等和父项目A、B都有它们自己的pom.xml,符合标准maven父子规则。
这两个项目都从SVN检出到我的本地eclipse。我正在积极地开发A。
我得知在B中开发了一个很好的公共功能(b4),我需要使用它。
 B/
 |--b1
 |--b2
 |--b3
 |--b4 (NEW)

b4的开发者已将该b4模块部署为我们组织存储库中的构件。我在我的模块a2的pom.xml文件中包含了对它的依赖。Eclipse从存储库下载了所需的构件,我可以导入其中的类。

现在问题出现了... 出于某种目的,我需要检查b4的源代码。由于我已经在本地eclipse中检出了B,因此我从SVN更新了它并检出了b4模块。我还运行了b4模块的pom.xml文件,使用了clean、package等目标。 当我完成编码后,我需要创建一个a2模块的JAR。我在a2的pom.xml上运行了"package"命令,结果a2模块出现了错误,而且这些错误也不是很用户友好。唯一确定的是日志中有b4的名称。

解决方法: 尝试了很多小时的解决方案后,我在B项目的目录(即../codebase/B)中从控制台运行了"mvn -U clean install"命令。由于B是父级项目,clean install命令会为所有模块(包括b4)运行,并成功运行。之后,我为我的父项目A运行了"mvn -U clean install"命令。这个方法奏效了!a2模块被成功编译、安装(稍后打包)。

这里要注意的重要一点是,如果b4在你的工作区中,请不要只安装b4。你需要进行完整的B清洁安装。我从Zuill的答案中得出了这个解决方案。

编辑:还有一件事需要注意,如果我没有在本地环境中检出B项目,那么这个问题可能不会发生在我身上。我倾向于认为这是因为我在本地工作区中检出了B。


感谢您的帮助。我遇到了同样的问题,项目A添加了来自项目B子模块B-IDL的依赖项。我应该mvn部署整个B项目,而不仅仅是mvn部署子模块B-IDL。 - Armstrongya

5

对我来说,实际上问题似乎是依赖于 POM。

我通过使用 jitpack 虚拟仓库来解决这个问题,使用该仓库可以基于 URL 包含 github 仓库,而不是它们自己的 POM(在我的情况下,这似乎有误)。

    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>

这对我很有效。pom.xml文件的repository部分应该被正确更新,</id>标签应该是repository的名称。节省了我很多时间! - Anuradha Fernando

5
你提到了两个不同的groupId,一个是com.morrislgn.merchandising.common,另一个是com.johnlewis.jec.webpim.common。也许这就是问题所在。

好的发现 - 不,不幸的是不是这样。我从 POM XML 中复制了错误的标签,那个标签在我需要的标签上面,我没有注意到自己做了什么。哎呀!我编辑了问题来修复我的愚蠢错误! - Morrislgn

5

我曾经也遇到过同样的问题,尽管执行了mvn -U clean install命令,但问题并没有得到解决!

最终,我通过删除整个.m2文件夹并重新启动IDE解决了该问题!

因此,有时候问题会出现在本地Maven存储库中存在一些不兼容或问题的情况下。


尝试在离线状态下进行Maven同步,结果完全破坏了IntelliJ。按照您的建议,删除了.m2文件夹,现在它像魔法一样正常工作!谢谢! - Victor Grazi

4

3
在我们的情况下,错误出现是因为在多模块Maven配置中一些项目引用了其他项目,而其中一个项目的组ID重命名不正确。
我们有一个聚合项目(billing-parent),它包含两个模块(billing-api,billing)。
com.company.team:billing-parent
|-com.company.team:billing-api
|-com.company.team:billing

项目 billing 依赖于 billing-api。因此在其 pom.xml 中需要添加以下内容:

<dependency>
    <groupId>com.company.team</groupId>
    <artifactId>billing-api</artifactId>
    <version>${project.version}</version>
</dependency>

我们决定将groupId从com.company.team改为com.company.team.billing。我们在父级pom.xml和两个模块的<parent>部分中替换了旧值。但是忘记更新上面的依赖项。因此,billing项目引用了旧的billing-api构件,最终导致在一段时间后构建billing模块时出现错误,如下所示: [ERROR] Failed to execute goal on project billing: Could not resolve dependencies for project com.company.team.billing:billing:jar:3.5.1-SNAPSHOT: Failed to collect dependencies at com.company.team:billing-api:jar:3.5.1-SNAPSHOT: Failed to read artifact descriptor for com.company.team:billing-api:jar:3.5.1-SNAPSHOT: Failure to find <parent of the com.company.team:billing-parent project which is not available any more> 尽管billing-api模块构建没有错误。
解决方法1:同样更改dependency中的groupId
解决方法2:像这样使用${project.groupId}属性替换groupId
<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>billing-api</artifactId>
    <version>${project.version}</version>
</dependency>

结论. 如果你在多模块配置中遇到了错误,我的建议是:仔细检查邻居模块的依赖项的groupIdartifactId


2
我知道我很勇敢,九年后才问这个问题...
对我来说,这是一个子依赖项未找到的问题。通过查看“错误日志”视图,我最终找到了真正的问题,其中包含一个 “构建期间发生内部错误。” 的行。双击它会显示一个带有堆栈跟踪的弹出窗口,最后一个原因揭示了我本地存储库中损坏的 JAR 文件。我清理了它,Eclipse/m2e 又能够正常工作了。

谢谢!这看起来是一个更好的线索,值得我进一步调查! - undefined

1
这个错误基本上是说maven无法从本地存储库读取某个依赖项。可能是因为某个jar文件没有正确下载。因此,请转到您的maven本地存储库,并确保没有任何.lastUpdated扩展文件。

这是我的问题。一旦我删除了无法正常工作的依赖项中的lastUpdated文件,它就可以正常运行了。 - Prashant Kalkar

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