主要和测试之间的Maven依赖关系

时间:2019-02-17 11:07:13

标签: maven

我有一个包含两个模块的多模块项目:

  1. 存在核心
  2. exist-testkit

exist-core同时具有src/main/javasrc/test/java,而exist-testkit仅具有src/main/java

两个项目之间存在依赖关系,但是它们在主要和测试之间是分开的,即:

  1. exist-testkit/src/main/java中的类依赖于exist-core/src/main/java

  2. exist-core/src/test/java中的类依赖于exist-testkit/src/main/java

因此,编译顺序必须为:

  1. exist-core/src/main/java
  2. exist-testkit/src/main/java
  3. 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源文件夹之间没有周期性的依赖关系?我宁愿不必将接口重构为第三个模块,因为这将需要大量工作。

2 个答案:

答案 0 :(得分:0)

这是模块之间的循环依赖关系,即使它不在级别或源文件夹上也是如此。由于Maven一个接一个地构建一个模块,因此您的结构不起作用。您无法编译模块核心的主要类别,然后编译testkit的主要类别,然后再运行模块核心的测试,因为无法拆分模块构建。

因此本质上,您需要重构。此外,这将使构建和依赖关系更易于理解。

答案 1 :(得分:0)

如前所述-您面临模块之间的循环依赖。应该消除这种依赖性。这不仅是Maven的问题,也是意外复杂性的根源,应该避免。

要消除循环依赖性,我可以看到三种方法:

1)介绍第3个模块,例如exist-common。然后,您的编译顺序将是exist-commonexist-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-mainexists-core-test模块。然后,您的编译顺序将是:exist-core-mainexist-testkit,然后是exist-core-test

最后一种方法很有用,您只需更新maven配置并更改目录结构即可。因此,无需执行严重的重构。但是,这使项目结构看起来有点不一致。

如果选择第三种方法,则需要执行以下操作:

  1. 将核心测试移至项目根目录下的目录exists-core-test

  2. 更新您的父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>
  1. 使您的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>