Maven依赖项解析失败,因为未替换属性

时间:2013-09-04 08:29:43

标签: maven-3

我们已经在maven(3.0.5)项目上工作了几个月,突然间我们在建立新的开发环境(没有本地maven存储库)时遇到了这个错误:

[ERROR] Failed to execute goal on project [100's of dependencies truncated]: Failed to read artifact descriptor for org.apache.httpcomponents:httpclient:jar:${httpcomponents.version}: Could not transfer artifact org.apache.httpcomponents:httpclient:pom:${httpcomponents.version} from/to nexus (http://bob.premitech.net:8081/nexus/content/groups/public): Illegal character in path at index 96: http://bob.premitech.net:8081/nexus/content/groups/public/org/apache/httpcomponents/httpclient/${httpcomponents.version}/httpclient-${httpcomponents.version}.pom -> [Help 1]

我正在使用一个多模块项目,您可能认为错误的显而易见的事情是$ {httpcomponents.version}未定义。除了在父pom中定义为4.2.5。即使更加笨拙,硬编码版本而不是使用属性也不会改变错误信息。

我甚至尝试完全删除了http组件依赖项。这也没有任何作用。唯一有效的方法是手动将正确的依赖项复制到本地maven存储库(.m2),这完全违背了首先使用maven的目的。

有没有人知道这里可能出现什么问题?是否有某种我不知道的缓存机制?

1 个答案:

答案 0 :(得分:2)

正如你所说,即使你的POM中的版本硬编码仍然给你这样的错误,在我看来,“不正确”的版本来自其他依赖的传递。 IIRC,依赖的占位符不会在Maven中替换。

例如,您的foo项目取决于您自己的bar-frameworkfoobar-framework都取决于httpcomponent。在bar-framework中,您还使用了版本的属性占位符。在这种情况下,如果您在具有问题的新计算机中构建bar-framework,则bar-framework POM包含httpcomponent版本的未替换属性。那么即使你的foo项目是正确的,由于传递依赖性,Maven仍然需要解析不正确的http组件。

尝试mvn dependency:tree来了解如何在项目中获得依赖关系。这可能会给出一些提示。