Java Maven循环依赖

Java Maven循环依赖,java,eclipse,maven,maven-module,Java,Eclipse,Maven,Maven Module,我的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:pro

我的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 @
如果不添加依赖项,产品将无法访问功能模块中定义的功能,反之亦然

父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>

4.0.0
com.catalog
目录
0.0.1-快照
聚甲醛
org.springframework.boot
spring启动程序父级
1.5.2.1发布
org.hibernate.javax.persistence
hibernate-jpa-2.1-api
1.0.0.1决赛
org.osgi
org.osgi.core
4.3.1
org.osgi
org.osgi.enterprise
4.2.0
org.hibernate
休眠实体管理器
5.0.0.1决赛
org.hibernate
休眠验证器
5.4.1.最终版本
javassist
javassist
3.12.1.GA
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧起动试验
测验
com.jayway.jsonpath
json路径
测验
朱尼特
朱尼特
3.8.1
测验
mysql
mysql连接器java
6.0.6
类别
资源
冬眠
产品
帮手
特色

产品模块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>
<?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>

4.0.0
com.catalog
目录
0.0.1-快照
产品
产品
http://maven.apache.org
UTF-8
com.catalog
冬眠
0.0.1-快照
com.catalog
类别
0.0.1-快照
com.catalog
帮手
0.0.1-快照
com.catalog
特色
0.0.1-快照
功能模块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>
<?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>

4.0.0
com.catalog
目录
0.0.1-快照
com.catalog
特色
0.0.1-快照
特色
http://maven.apache.org
UTF-8
com.catalog
冬眠
0.0.1-快照
com.catalog
产品
0.0.1-快照

重构你的模块。基本上,这两个模块中需要的所有内容都应该成为一个共同的依赖项。依赖关系树中不能有循环,它就是不起作用。


重构你的模块。基本上,这两个模块中需要的所有内容都应该成为一个共同的依赖项。您的依赖关系树中不能有循环,它只是不起作用。

它可能不适用于您的特定情况,但纠正循环依赖关系的另一个选项是使用事件

首先,在树中设置模块,使其没有周期性依赖关系。将事件类放在树的顶部。然后发布并侦听任何模块中的事件。这允许您拥有相互通信的模块,而无需相互依赖

有关如何在Spring中发布和侦听事件,请参阅:


它可能不适用于您的特定情况,但另一种纠正周期性依赖关系的方法是使用事件

首先,在树中设置模块,使其没有周期性依赖关系。将事件类放在树的顶部。然后发布并侦听任何模块中的事件。这允许您拥有相互通信的模块,而无需相互依赖

有关如何在Spring中发布和侦听事件,请参阅:


之前要构建
功能
您需要构建
产品
。以前要构建
产品
,您需要构建
功能
。你在那里播种循环依赖吗?您必须重构这些模块,要么创建一个模块,要么将依赖代码提取到第三个独立的模块中,以避免糟糕的设计!创建实用程序模块并添加其对其他模块的依赖关系。@z21两个模块都有自己的hibernate实体类。产品和功能需要访问彼此的实体。你是不是建议我把所有的实体放在一个单独的模块中?作为替代方案,如果我在同一个项目中创建产品和功能作为包而不是maven模块,那会是一个更好的设计吗?之前要构建
Feature
,您需要构建
Product
。以前要构建
产品
,您需要构建
功能
。你在那里播种循环依赖吗?您必须重构这些模块,要么创建一个模块,要么将依赖代码提取到第三个独立的模块中,以避免糟糕的设计!创建实用程序模块并添加其对其他模块的依赖关系。@z21两个模块都有自己的hibernate实体类。产品和功能需要访问彼此的实体。你是不是建议我把所有的实体放在一个单独的模块中?作为替代方案,如果我在同一个项目中创建产品和功能作为包,而不是maven模块,那会是一个更好的设计吗?