我希望有人能帮助我解决一个我正在挣扎的问题。
当我试图从终端构建我的项目时,我得到这个错误:
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
常见的。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时,它也没有报告任何错误。
谁能告诉我这里我缺了什么或做错了什么?
我有一个项目
A/
|--a1
|--a2
现在我们组织里还有一个项目
B/
|--b1
|--b2
|--b3
(每个模块a1, b1等和父项目A, B都有自己的pom.xml,根据父和子的标准maven规则)
两个项目都是在我的本地eclipse上(从SVN)签出的。我正在积极研究A。
我了解到B中有一个很好的通用功能(b4),我需要使用它。
B/
|--b1
|--b2
|--b3
|--b4 (NEW)
b4的开发人员已经将这个b4模块部署在我们组织的存储库中。我包含了我的模块的POM的依赖,即a2的POM .xml。Eclipse从repo下载了所需的工件,我可以导入其中的类。
Now issue starts...
I needed to check the source code of b4 for some purpose and as I already had B checked out on my local eclipse I updated it from SVN and checked out module b4. I also ran pom.xml of module b4 with targets like clean, package etc.
After some time when I finishedd my coding I needed to create a JAR of my module a2. I ran "package" on a2's pom.xml and BAM!! errors n errors for a2 module.. These errors were also not very user friendly. Only thing is there was b4's name for sure in logs.
解决方案:
在尝试了许多解决方案许多小时后,我从控制台在我的B的项目目录(即在../codebase/B)中运行“mvn -U clean install”。因为B是父模块,所以clean install命令运行了所有模块,包括b4,并且运行成功。在这之后,我运行“mvn -U清洁安装”为我的父项目,这是a和工作!A2模块编译、安装、(之后打包)成功。
这里重要的一点是,如果b4在您的工作空间中,不要只安装b4。你将需要清洁安装完成b。我在阅读Zuill的回答后想出了这个解决方案
编辑:这里还要注意的一件事是,如果我没有在本地环境中检出B项目,那么这个问题可能不会发生在我身上。我倾向于认为发生这种情况是因为我在当地的工作场所检查了B。
在我们的例子中,出现错误是因为在多模块Maven配置中的一些项目引用其他项目时,groupId重命名不正确。
我们有一个聚合器项目(billing-parent),有两个模块(billing-api, billing):
com.company.team:billing-parent
|-com.company.team:billing-api
|-com.company.team: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>部分中的旧值。但是忘记更新上面的依赖项。因此,我们已经获得了计费项目引用旧的计费api工件的配置。最终,它喙构建计费模块后,一段时间的错误,如
[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: Failed to find <parent of the com.company.team:billing-parent project which is not available any more>
尽管billing-api模块构建时没有错误。
解决方案1:在依赖项中重命名groupId。
解决方案2:用${项目替换groupId。groupId}属性如下:
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>billing-api</artifactId>
<version>${project.version}</version>
</dependency>
结论。
因此,如果你在多模块配置中遇到错误,我的建议是:彻底检查groupId和artifactId对邻居模块的依赖关系。