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 @

不添加依赖项产品无法访问功能中定义的功能,反之亦然。

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

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

设计气味。

重构模块。基本上,两个模块中所需的一切都应涉及共同的依赖性。您无法在依赖树中有周期,它只是行不通的。

更新:,由于这个答案有时会得到一个新的投票,因此我想提及:"树"在"依赖树"中指图理论的树,这意味着根据定义您不能有周期:(

它可能对您的特定情况不起作用,但纠正周期依赖性的另一种选择是使用事件。

首先,将模块设置在没有周期性依赖性的树中。将活动课放在树的顶部。然后在任何模块中发布并聆听事件。这使您可以拥有相互通信的模块,而无需彼此依赖。

有关如何在春季发布和聆听事件的信息,请参见:

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

最新更新