【问题标题】:Maven runtime scope and cyclic dependencyMaven 运行时范围和循环依赖
【发布时间】:2023-03-04 11:29:01
【问题描述】:

我有两个模块 A 和 B。实际上 B 是 A 的插件。
B 在编译时依赖于 A。 A 不依赖于 B。 在 A 运行时我想将 B 添加到类路径中,所以在 A 的 pom.xml 中我添加以下依赖项

pom.xml

    <dependency>
        <groupId>my_group</groupId>
        <artifactId>my_Plugin</artifactId>
        <version>${project.version}</version>
        <scope>runtime</scope>
    </dependency> 

Maven 进程因循环依赖错误而失败

[ERROR] The projects in the reactor contain a cyclic reference: Edge between 'Vertex{label='A'}' and 'Vertex{label='B'}' introduces to cycle in the graph B-->A-->B -> [Help 1]

[错误]

为什么运行时依赖会影响编译时间?

【问题讨论】:

  • 有一种很好的方法可以为此类项目安排构建。如果你重构共享到另一个模块(C)的代码,项目B将不再需要在编译时依赖A——A和B都可以依赖C。那么让A依赖B就没有问题了在运行时。考虑这一点的一个好方法是考虑编写一个库 - 一堆可共享的代码 - 和一个应用程序,它是组装库的集合。应用程序项目实际上根本不需要包含任何代码。
  • 一种解决方案是将循环依赖项添加到配置文件中。这样当你构建模块 A 时 Maven 就不会抱怨循环依赖了。

标签: maven runtime cyclic


【解决方案1】:

按照柯南的建议,如果可能,将您的通用代码提取到单独的模块中以解决循环问题。通常,在这种情况下,人们会将公共接口和核心类提取到一个单独的模块中,该模块由两个模块扩展,这会导致循环依赖。然后,您将删除对最初处于循环状态的模块的直接依赖关系。有时这很难解决,但是模块化代码可以帮助您弄清楚如何重构代码,以便它可以轻松地重用。

【讨论】:

  • A的代码不是我负责的,所以不能分开。
  • 好吧,如果它是您或您的公司设计的代码,这就是要走的路。如果不是——根据你的例子和你告诉我们的那一点,没有其他明显的解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
相关资源
最近更新 更多