寻找缺失的Maven工件

10

我是Maven的新手,在添加依赖方面遇到了困难。 我正在尝试将现有项目转换为Maven,但在添加所有引用库中的jar文件的依赖关系后,收到了有关缺少构件的错误消息:

Missing artifact stax:stax:jar:1.0    
Missing artifact clover:clover:jar:1.3-rc4
Missing artifact log4j:log4j:bundle:1.2.16
Missing artifact stax:stax-ri:jar:1.0

从阅读这篇文章: 如何处理Maven缺少artifact错误?,听起来我需要手动下载这些JAR并将它们添加到我的本地Maven仓库。我的问题是如何找到这些JAR文件?我尝试过在Google上搜索它们,我可以找到一些名称类似的Jar包,但不完全像这些,所以我不确定它们是否是正确的JAR文件。

有没有处理这个问题的任何提示?log4j JAR是我原始项目中显式列出的唯一一个引用库,因此我猜其他JAR文件是由我拥有的其他JAR文件所需的,但我不知道在哪里找到它们或它们的确切名称。

谢谢!


如果你使用Maven并且必须手动下载构件,那么你正在做一些非常错误的事情。请发布你的pom.xml文件或其中相关部分。 - j13r
这正是我所思考的...由Eclipse m2e插件创建的POM存在一些问题,有关问题的描述请参见我的下面的答案。 - matthewb
9个回答

21

感谢大家的回复。问题的实际原因是对于这三个缺失的构件,由于某种原因,当Maven将它们下载到我的本地存储库时,.lastUpdated被添加到了jar包的末尾。例如,stax-1.0.jar.lastUpdated。这就是为什么Maven无法找到stax-1.0.jar的原因。

因此,要解决这个问题,我必须手动下载stax-1.0.jar,然后安装到本地maven存储库的与混乱文件完全相同的位置,以便Maven可以找到它。 (例如,使用以下命令:

mvn install:install-file -Dfile=<path-to-file>/stax-1.0.jar         
-DgroupId=stax -DartifactId=stax -Dversion=1.0 -Dpackaging=jar

在 maven 中,使用与现有的错误文件完全相同的 groupId 和 artifactId 对于 maven 找到该文件非常关键。


1
感谢分享你的解决方案。我会将其添加到我的本地代码库中,以备不时之需。哈哈。此外,还有一种选择是删除代码库目录,让Maven尝试重新获取文件。这在过去对我很有效! - Mike McMahon
@MikeMcMahon你的意思是说,一种故障安全措施是找到.m2仓库目录并将其删除,以某种方式强制Maven重新查找/重新下载库? - Don Cheadle
@mmcrae 是的 - 它通常位于 C:\users\<username>\.m2\repository 或旧版基于 Windows 的系统的 documents and settings 中(nix 应该是 /home/<username>/.m2/)。从那里,可以删除存储库文件夹并允许 Maven 从更大的 Maven 存储库重新下载所有依赖项。历史上,虽然不太常见,但依赖关系可能会出现问题或损坏。这将允许 Maven 重新下载和重建存储库。 - Mike McMahon
1
对我来说,一些Jars文件总是会被添加上“.lastUpdated”,所以我必须手动删除它。删除目录没有帮助。有人知道为什么会这样吗? - juminoz

2
您可以在maven.apache.org下找到依赖搜索站点。前往左侧导航菜单中的FAQ(官方),滚动至页面底部即可找到。

1

你可以尝试将新的存储库添加到你的pom.xml文件中。

<repositories>
     <repository>
    <id>java.net</id>
    <url>http://download.java.net/maven/2/</url>
    </repository>
      <repository>
        <id>jboss</id>
        <url>http://repository.jboss.com/maven2</url>
 </repository>
</repositories>

1

很可能你的POM定义对于log4j不正确。与log4j相关的所有内容都应该在Maven中轻松获得。

此外,如果你知道bundle的名称(例如log4j),你几乎总是可以通过快速谷歌搜索"[bundle name] maven pom"来获取信息。在前几个搜索结果中,你应该可以找到包含快速代码片段的Maven仓库,或者是打包好的jar文件的实际网站和Maven说明。

例如log4j:

<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>
</dependencies> 

有时候,您只需要指定存储库以查找项目(如果它没有托管在更大的Maven存储库中)。
您可以像这样指定新存储库。
<repositories>
    <repository>
        <id>Java.Net</id>
        <url>http://download.java.net/maven/2/</url>
    </repository>
</repositories>

当你绝对找不到已经为你打好的 Maven 构件的时候(这通常适用于你不能将专有的 JAR 或驱动程序包含在你的项目中),你可以让用户通过命令行手动安装该项。

mvn install:install-file -DgroupId=[组 ID] -DartifactId=[构件 ID] -Dversion=[版本号] -Dfile=/path/to/the/file -Dpackaging=[类型]

然后,你可以使用上述信息在 maven 文件中引用它。

例如,我有一个 salesforce.com 项目的自定义引用

mvn install:install-file -DgroupId=com.salesforce -DartifactId=wsc -Dversion=22 -Dfile=\tsclient\H\development\java\wsc-22.jar -Dpackaging=jar

要在 Maven 中访问它:

<dependency>
    <groupId>com.salesforce</groupId>
    <artifactId>wsc</artifactId>
    <version>22</version>
</dependency>

最后,您可以在它们各自的网站上找到JAR文件(或它们的Maven信息)(请注意,我只是根据JAR名称基于这些链接,这些可能不是实际的网站,除了我知道正确的log4j)

Stax

Clover

Log4j


是的,我的POM(由Eclipse m2e插件自动生成)对于Log4j(以及其他有问题的构件,见下面发布的答案)是不正确的。对于Log4j,在“type”属性下,它说“bundle”。当我删除它时,它就可以工作了。 - matthewb

1
几天以来,这个愚蠢的错误一直困扰着我,我发现了下面这篇文章article
作者描述了一个工作区存储库可能过时的情况。在我的情况下,重新导入正确的插件就有所帮助。工作区存储库已经更新,一切正常。


0

你的问题可能与MNG-4142有关。这个bug意味着如果在artifact maven-metadata-local.xml中设置了localCopytrue,那么maven将不会下载新的快照。

请注意,这个bug的标题有点误导,所以阅读评论很重要。

你可能认为使用maven的-U标志可以解决这个问题,但显然并不是这样。

目前的解决方法似乎是搜索所有maven-metadata-local.xml实例,并将localCopy的值更改为false


0

我通过将log4j版本从1.2.15更改为1.2.16来解决了这个问题。


0

这也可能是由于dom4j引起的。当我使用以下设置时,出现了相同的错误。

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>20040902.021138</version>
</dependency>

改成以下代码后,错误消失了。

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

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