我有一个包含两个模块的多模块项目:
exist-core同时具有src/main/java
和src/test/java
,而exist-testkit仅具有src/main/java
。
两个项目之间存在依赖关系,但是它们在主要和测试之间是分开的,即:
exist-testkit/src/main/java
中的类依赖于exist-core/src/main/java
。
exist-core/src/test/java
中的类依赖于exist-testkit/src/main/java
。
因此,编译顺序必须为:
exist-core/src/main/java
exist-testkit/src/main/java
exist-core/src/test/java
但是,正如Maven所说,我似乎还没走得那么远
[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:
Edge between 'Vertex{label='org.exist-db:exist-testkit:4.6.0-SNAPSHOT'}'
and 'Vertex{label='org.exist-db:exist-core:4.6.0-SNAPSHOT'}'
introduces to cycle in the graph org.exist-db:exist-core:4.6.0-SNAPSHOT
--> org.exist db:exist-testkit:4.6.0-SNAPSHOT
--> org.exist-db:exist-core:4.6.0-SNAPSHOT @
我的exist-testkit/pom.xml
有:
<dependency>
<groupId>org.exist-db</groupId>
<artifactId>exist-core</artifactId>
<version>${project.version}</version>
</dependency>
我的exist-core/pom.xml
有:
<dependency>
<groupId>org.exist-db</groupId>
<artifactId>exist-testkit</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
是否可以说服Maven源文件夹之间没有周期性的依赖关系?我宁愿不必将接口重构为第三个模块,因为这将需要大量工作。
答案 0 :(得分:0)
这是模块之间的循环依赖关系,即使它不在级别或源文件夹上也是如此。由于Maven一个接一个地构建一个模块,因此您的结构不起作用。您无法编译模块核心的主要类别,然后编译testkit的主要类别,然后再运行模块核心的测试,因为无法拆分模块构建。
因此本质上,您需要重构。此外,这将使构建和依赖关系更易于理解。
答案 1 :(得分:0)
如前所述-您面临模块之间的循环依赖。应该消除这种依赖性。这不仅是Maven的问题,也是意外复杂性的根源,应该避免。
要消除循环依赖性,我可以看到三种方法:
1)介绍第3个模块,例如exist-common
。然后,您的编译顺序将是exist-common
,exist-testkit
,然后是exist-core
。但是,正如您提到的那样,这将需要大量的重构,因此您至少现在不想这样做。
为了清楚起见,这是假定的变换:
---------->
exist-core exist-testkit
<----------
exist-core -------------------------->
| exist-common
---------> exist-testkit ---------->
2)进行单向依赖,这样exist-core
将依赖于exist-testkit
。
但是,这迫使您在模块之间复制代码,这不是一个好主意。
3)将exist-core
测试(当前在exist-core/src/test/java
下)定义为一个单独的模块。因此,您将拥有exist-core-main
和exists-core-test
模块。然后,您的编译顺序将是:exist-core-main
,exist-testkit
,然后是exist-core-test
。
最后一种方法很有用,您只需更新maven配置并更改目录结构即可。因此,无需执行严重的重构。但是,这使项目结构看起来有点不一致。
如果选择第三种方法,则需要执行以下操作:
将核心测试移至项目根目录下的目录exists-core-test
。
更新您的父pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>your.group.id</groupId>
<artifactId>your-artifact-id</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>exist-core-main</module>
<module>exist-testkit</module>
<module>exist-core-test</module>
<!-- Other modules -->
</modules>
<!-- Other relevant configurations -->
</project>
exist-core-test
pom.xml像这样:<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>your.group.id</groupId>
<artifactId>exist-core-test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>your.group.id</groupId>
<artifactId>exist-core-main</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>your.group.id</groupId>
<artifactId>exist-testkit</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<!-- Other dependencies -->
</dependencies>
<!-- Other relevant configurations -->
</project>