Maven 将一个项目的依赖项继承到另一个项目中

Posted

技术标签:

【中文标题】Maven 将一个项目的依赖项继承到另一个项目中【英文标题】:Maven inherit dependencies from a project into another 【发布时间】:2013-08-01 19:50:14 【问题描述】:

给定一个 Maven 项目 A 生成一个 jar:

<groupId>myprojects</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
    <dependency>
        <groupId>some.needed.group</groupId>
        <artifactId>some.needed.artifact1</artifactId>
    </dependency>
    <dependency>
        <groupId>some.needed.group</groupId>
        <artifactId>some.needed.artifact2</artifactId>
    </dependency>
</dependencies>

项目 B 依赖于 A 并生成企业档案:

<groupId>myprojects</groupId>
<artifactId>B</artifactId>
<version>1.0</version>
<packaging>ear</packaging>
<dependencies>
    <dependency>
        <artifactId>A</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>

我怎样才能让项目 B 的耳朵工件不仅包括项目 B 的 jar 工件,而且还包括其依赖的工件 some.needed.artifact1 和 some.needed.artifact2?


我编辑并添加了这个,因为似乎只有在从 Bamboo 运行 mvn 时才会出现该行为: 奇怪的是,当我从 Eclipse 本地运行 mvn 时它正在工作,但当它由 Bamboo 持续集成服务器运行时却没有。在本地运行中,我正确生成了 application.xml,其中包含对所有传递依赖项的引用,相应的 jar 文件复制到 lib 文件夹。在 Bamboo 计划中,生成的 application.xml 不包含引用,并且 jar 文件不在 lib 文件夹中。

【问题讨论】:

已经应该了;依赖是传递的。 【参考方案1】:

首先作为一个修正,我认为依赖应该是 A,而不是 B,像这样:

   <dependencies>
    <dependency>
        <artifactId>A</artifactId>
        <version>1.0</version>
    </dependency>
 </dependencies>

关于拥有依赖 jar 的原始问题,我认为它们应该在您的 EAR 文件中可用,因为您依赖于 A project,而这又依赖于 some.needed.artifact1 and some.needed.artifact2(传递依赖)作为您的范围provided 是默认值,因此 maven 会将其作为编译器,并且所有 jar 文件都会捆绑在您的 ear 文件中。

谢谢

【讨论】:

确实,我打错了 artifactId。我已经在我的文本中重新编辑并更正了它。 奇怪的是,当我从 Eclipse 本地运行 mvn 时它正在工作,但当它由 Bamboo 持续集成服务器运行时却没有。在本地运行中,我使用对所有传递依赖项的引用正确生成了 application.xml,并将它们复制到 lib 文件夹中。在 Bamboo 计划中,生成的 application.xml 不包含引用,并且这些不在 lib 文件夹中。我会继续搜索。 嗯,对不起,Bamboo 不属于我的保护伞:(。您可以在 Bamboo 下标记您的问题,以便其他 Bamboo 专家可以帮助您。谢谢【参考方案2】:

在产生耳朵的项目 B 中,您可以像这样包含对 A 的依赖项

<modules>
  <module>project A</module>
</modules>
<dependencies>
  <dependency>
    <groupId>some.needed.group</groupId>
    <artifactId>A</artifactId>
    <version>1.0</version>
  </dependency>
</dependencies>

在项目A中,将父项目定义为项目B,如下所示

<parent>
        <groupId>myprojects</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <name>project B</name>
</parent>
<name>project A</name>

【讨论】:

只有打包'pom'的项目才能定义模块;项目 A 不能包含此类引用,因为它的包装是“耳朵”。 我猜你没有正确阅读我的答案。我的回答中没有任何地方说项目 A 包装了耳朵,因为您自己表示项目 B 包装了耳朵。我上面说过在项目A pom中定义项目B为项目A的父项目,并将项目A作为一个模块包含在项目B pom中,这样在构建项目B时可以直接打包项目A的jar文件 在我之前的回答中,我的意思是项目“B”。除了 reactor(pom 打包)之外,没有其他项目可以定义模块。 这正是我所说的,项目 B 是你的反应堆,你在哪里为项目 A 定义模块对吗?

以上是关于Maven 将一个项目的依赖项继承到另一个项目中的主要内容,如果未能解决你的问题,请参考以下文章

maven如何继承父工程的依赖关系

如何将本地项目(不是 jar)作为依赖项添加到 Maven 项目

如何组装一个多项目的蚂蚁构建系统

无法将Spring Boot依赖项从父模块导入子模块

如何强制 IntelliJ 中的 Maven 从本地 .m2 存储库中提取特定依赖项

如何在另一个具有更高Spring版本的Spring项目中使用具有Spring作为打包依赖项的jar?