【问题标题】:Missing transitive Maven dependency of local jar缺少本地 jar 的传递性 Maven 依赖项
【发布时间】:2017-06-23 20:14:01
【问题描述】:

为提前使用缩写词道歉。

我正在处理一个 Maven 项目 Foo,它依赖于本地 jar BarBar 也是用 Maven 构建的,因为它是一个本地 jar,所以我在 Foo 的文件夹结构中创建了一个本地 repo,并将 jar 放在那里。

Bar.jar 放在base_dir_of_Foo\repo\group_ID\artifact_ID\1.0-SNAPSHOT\Bar.jar

我遇到的问题是,当我运行Foo 时,它会抛出NoClassDefFoundError,因为它在Bar 的依赖项之一中找不到类。所以,Foo 缺少通过Bar 的传递依赖。

需要注意的一点是,当我为 Foo 运行 mvn clean package 时,我看到一个警告说“缺少 POM for Bar”。 Foo 使用反射调用BFoo 能够找到Bar 中定义的类,但看起来A 无法找出Bar 的依赖关系。知道为什么会这样吗?

本地仓库在Foopom.xml中定义:

<repositories>
    <repository>
        <id>local-repo</id>
        <name>Local</name>
       <url>file://${basedir}/repo</url>
   </repository>
</repositories>

最后Foo 依赖于Bar 和默认编译范围:

<dependency>
    <groupId>group_ID</groupId>
    <artifactId>artifact_ID</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

更新: 我发现为什么找不到 Bar 的 pom,是因为我们把 Bar.jar 放在本地 repo 中,maven 只会将 jar 文件复制到本地存储库缓存中,它不会从 jar 中提取 pom.xml,是这样预期?

在 C:\Users\hancwang.m2\repository\group-id\Bar\1.0-SNAPSHOT 中,我看到 Bar-1.0-snapshot.jar 被复制过来,但没有 Bar-1.0-snapshot.pom .

【问题讨论】:

  • 你在本地用 Maven 构建 Bar 源码吗?
  • 是的,我这样做了,然后我将 Bar.jar 复制到 Foo 下的本地 repo。
  • 请试试我的回答

标签: java maven


【解决方案1】:

您的 &lt;repository&gt; 定义可能指向不完整的存储库,例如一个缺少 .pom 文件的仓库。

假设您在本地构建 Bar 源代码,如果您在 Bar 中运行 mvn install,您将在本地存储库中安装其工件。这样,Foo 会正常找到 Bar。在这种情况下,您不需要定义 &lt;repository&gt;

所以,尝试:

  • 在酒吧中运行 mvn installmvn clean install
  • 删除指向file:// jar 的&lt;repository&gt; 定义

【讨论】:

  • 问题是另一个人可以 git pull Foo 但无权访问 Bar,这将导致 Foo 的构建失败。
  • @HanchiWang 别人不能建吧源码吗?
  • 他们不能,因为 1) Foo 是开源的,但 Bar 不是,2) 我希望 Foo 的客户能够开箱即用地运行 jar 文件和 mvn 包。跨度>
  • @HanchiWang 我会想办法的。同时将您的最后一条评论放在问题中,因为这是相关要求
猜你喜欢
  • 2011-04-10
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2014-06-10
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多