Maven зависимости между основным и тестовым - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть многомодульный проект с двумя модулями:

  1. Существующее ядро ​​
  2. Существующее-testkit

Существующее ядро ​​имеет оба src/main/java и src/test/java, тогда как существующий-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, что между исходными папками нет циклической зависимости?Я бы предпочел не проводить рефакторинг интерфейсов в 3-й модуль, так как это было бы большим трудом.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Как уже упоминалось - вы сталкиваетесь с круговой зависимостью между вашими модулями.Эта зависимость должна быть устранена.Это проблема не только для 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-конфиги и измените структуру каталогов.Таким образом, не будет необходимости проводить серьезный рефакторинг.Однако из-за этого структура проекта выглядит непоследовательной.

Если вы выберете третий подход, вам нужно будет сделать следующее:

  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>
Сделайте ваш 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>
0 голосов
/ 17 февраля 2019

Это циклическая зависимость между модулями, даже если она не находится на уровне или в исходных папках.Поскольку Maven создает один модуль за другим, ваша структура не работает.Вы не можете скомпилировать основные классы ядра модуля, затем скомпилировать основные классы тестового набора и затем запустить тесты для ядра модуля, потому что сборки модуля не могут быть разделены.Кроме того, это облегчит понимание сборки и зависимостей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...