Maven中的循环依赖和项目的可怕结构

时间:2017-03-16 19:11:05

标签: java maven

我遇到了maven的问题。我有一个巨大的多模块项目,改变其结构的可能性有限。

所以,我们说我有3个模块:A,B,C。

  • A是B和C的父母。
  • C使用B中的类,因此我们将B作为C&C的POM文件中的依赖项。
  • B不需要将C作为依赖项来成功编译。

目前,没有任何问题。

不幸的是,B在运行时使用C(spring,ioc,...),所以有人将C添加为B的依赖,所以我们在Maven中有一个可怕的循环。构建完成失败(类似于"循环检测到"在日志中)。

我想保持这种方式(在B模块中以某种方式提供C依赖),因为我需要使用所有需要的JAR存档(包括来自C的JAR)编译和交付B.

在完全编译B之后,我可以以某种方式构建C并将其JAR复制到B的目标目录吗?有没有一个插件或工具可供maven用来做到这一点?

如果这篇文章不清楚,我会尝试更详细地描述它。

提前致谢;)

2 个答案:

答案 0 :(得分:0)

我将如何做到这一点。来自C&#的pom文件:

 <profile>
    <id>compile</id>
      <dependencies>
        <dependency>
           use B here but do not use in the main dependencies section
        </dependency>
          + other dependencies
      </dependencies>
  </build>
</profile>

例如,您可以使用mvn compile -Pcompile

编译C模块

来自B&#的pom文件:

 <profile>
    <id>run</id>
      <dependencies>
        <dependency>
           use C here but do not use in the main dependencies section
        </dependency>
          + other dependencies
      </dependencies>
  </build>
</profile>

使用mvn yourcommandforrunning -Prun

运行B模块

通过这种方式,您可以解决循环依赖性问题。

答案 1 :(得分:0)

听起来有两个问题:

  1. 如何告诉Maven有关工件之间仅限运行时的依赖关系。
  2. 如何让Maven利用依赖关系汇集所有相关的依赖关系。
  3. Maven具有依赖关系管理功能,允许您使用&#34;范围&#34;来通知maven这些细微差别。依赖元素的元素。在这种情况下,我认为你想要

    <scope>runtime</scope>
    

    请参阅documentation。特别是:

      

    runtime - 此范围指示编译不需要依赖项,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径。

    正确使用运行时scope应解决循环依赖问题。

    关于第二个问题,您没有提供足够的信息来提供明确的答案。但是,您几乎肯定希望使用maven插件来利用maven关于依赖关系的信息。例如,如果你想生产单个&#34;脂肪&#34;包含所有内容的jar,你想看看maven-shade-plugin。另一个选项是maven-assembly-plugin,它非常灵活,可以包含程序集中的所有依赖项。还有其他插件可以处理各种其他常见情况。如果您在如何使用特定插件时遇到问题,可能需要制定单独的问题。