Циклическая зависимость Maven

мой проект maven имеет несколько модулей maven. Два из этих модулей (продукт и функция) зависят друг от друга. Когда я включаю модули в качестве зависимостей в файлы pom, ! на модулях появляется метка. При запуске установки maven я получаю эту ошибку.

The projects in the reactor contain a cyclic reference: Edge between 
'Vertex{label='com.catalog:feature:0.0.1-SNAPSHOT'}' and 
'Vertex{label='com.catalog:product:0.0.1-SNAPSHOT'}' introduces to 
cycle in the graph com.catalog:product:0.0.1-SNAPSHOT --> 
com.catalog:feature:0.0.1-SNAPSHOT --> com.catalog:product:0.0.1-
SNAPSHOT @

Без добавления зависимостей Продукт не может получить доступ к функциям, определенным в модуле Feature, и наоборот.

Родительский pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.catalog</groupId>
    <artifactId>catalog</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.enterprise</artifactId>
            <version>4.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>

        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency> 

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>

   </dependencies>

   <modules>
       <module>category</module>
       <module>resource</module>
       <module>hibernate</module>
       <module>product</module>
       <module>helper</module>
       <module>feature</module>
   </modules>

Product module pom.xml

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.catalog</groupId>
        <artifactId>catalog</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>product</artifactId>

    <name>product</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.catalog</groupId>
            <artifactId>hibernate</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.catalog</groupId>
            <artifactId>category</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.catalog</groupId>
            <artifactId>helper</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.catalog</groupId>
            <artifactId>feature</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>

</project>

Функциональный модуль pom.xml

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.catalog</groupId>
        <artifactId>catalog</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.catalog</groupId>
    <artifactId>feature</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>feature</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.catalog</groupId>
            <artifactId>hibernate</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.catalog</groupId>
            <artifactId>product</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>

</project>

person Sid    schedule 29.06.2017    source источник
comment
Раньше для постройки Feature нужно было построить Product. Раньше для постройки Product нужно было построить Feature. Вы задаете циклическую зависимость? Вам придется реорганизовать эти модули и либо создать один модуль, либо извлечь зависимый код в третий независимый модуль.   -  person Pelocho    schedule 29.06.2017
comment
Результат плохого дизайна! Создайте служебный модуль и добавьте его зависимость от других модулей.   -  person z21    schedule 29.06.2017
comment
@ z21 Оба модуля имеют свои собственные классы сущностей гибернации. Продукт и функция нуждаются в доступе к сущностям друг друга. Вы предлагаете мне поместить все объекты в отдельный модуль? В качестве альтернативы, что, если я создам продукт и функцию в виде пакетов в том же проекте вместо модулей maven, будет ли это лучшим дизайном?   -  person Sid    schedule 29.06.2017


Ответы (2)


Запах дизайна.

Рефакторинг ваших модулей. По сути, все, что необходимо в обоих модулях, должно войти в общую зависимость. У вас не может быть циклов в вашем дереве зависимостей, это просто не сработает.

person D. Kovács    schedule 29.06.2017

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

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

Чтобы узнать, как публиковать и прослушивать события в Spring, см.

https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

person Collin Krawll    schedule 28.03.2018