【问题标题】:A cycle was detected in the build path of project in maven在maven项目的构建路径中检测到一个循环
【发布时间】:2017-05-15 06:43:19
【问题描述】:

有很多关于这个错误的头条新闻。但我找不到适合我的解决方案。

我将创建一个多模块项目。 parentProjectprojectAprojectDprojectUtilprojectWprojectW的包装是war,包含projectAprojectDprojectUtiljar文件。

projectParent
├───projectA
│   ├───src
│   │   └───main/java/projectA
│   │       ├───ClassA.java
│   │       └───ClassB.java
│   └───pom.xml ---- packaging = jar & dependencies = projectD and projectUtil
├───projectD
│   ├───src
│   │   └───main/java/projectD
│   │       ├───ClassC.java
│   │       └───ClassD.java
│   └───pom.xml ---- packaging = jar & dependencies = projectA and projectUtil
├───projectUtil
│   ├───src
│   │   └───main/java/projectUtil
│   │       └───StringUtil.java
│   └───pom.xml ---- packaging = jar & dependencies = no dependency
├───projectW
│   ├───src
│   │   └───main/java/projectW
│   │       └───Test.java
│   └───pom.xml ---- packaging = war & dependencies = projectA, projectD and projectUtil
└───pom.xml ---- packaging = pom & modules = projectA, project D, projectUtil and projectW

在项目的构建路径中检测到一个循环之类的错误。我将错误转化为警告,如互联网上的解决方案。

Windows -> 首选项 -> Java-> 编译器 -> 构建 -> 循环 依赖关系

Test.java 已成功运行,但由于此警告,maven 现在无法安装。有人可以建议我解决以下例外情况吗?

Test.java

ClassA a = new ClassA();
a.getD().mrbDunya();

ClassD d = new ClassD();
d.getB().sayHello();

编辑

parentProject/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.earslan</groupId>
    <artifactId>projectParent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>Project Parent</name>

    <modules>
        <module>projectA</module>
        <module>projectD</module>
        <module>projectUtil</module>
        <module>projectW</module>
    </modules>

</project>

projectA/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.earslan</groupId>
        <artifactId>projectParent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>projectA</artifactId>
    <packaging>jar</packaging>

    <name>Project A</name>

    <dependencies>
        <dependency>
            <groupId>com.earslan</groupId>
            <artifactId>projectD</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.earslan</groupId>
            <artifactId>projectUtil</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

projectUtil/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.earslan</groupId>
        <artifactId>projectParent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>projectUtil</artifactId>
    <packaging>jar</packaging>

    <name>Project Util</name>

    <dependencies>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

projectW/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.earslan</groupId>
        <artifactId>projectParent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>projectW</artifactId>
    <packaging>war</packaging>

    <name>Project W</name>

    <dependencies>
        <!-- Project Files Dependency -->
        <dependency>
            <groupId>com.earslan</groupId>
            <artifactId>projectA</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.earslan</groupId>
            <artifactId>projectD</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.earslan</groupId>
            <artifactId>projectUtil</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- JSF Dependency -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!-- PrimeFaces Dependency -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>6.1</version>
        </dependency>
        <dependency>
            <groupId>org.primefaces.themes</groupId>
            <artifactId>bootstrap</artifactId>
            <version>1.0.10</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>prime-repo</id>
            <name>PrimeFaces Maven Repository</name>
            <url>http://repository.primefaces.org</url>
            <layout>default</layout>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

【问题讨论】:

  • 添加 pom 文件
  • @Jens pom 的 projectW 文件还是全部?
  • 你需要移除循环依赖。如果这不能通过移动类来完成,那么定义接口并依赖它们而不是实现类可能会有所帮助。
  • @EmreArslan 所有人

标签: java maven


【解决方案1】:

├──项目A
│ ├───src
│ │ └───main/java/projectA
│ │ ├───ClassA.java
│ │ └───ClassB.java
│ └───pom.xml ---- 打包 = jar & 依赖 = projectD 和 projectUtil
├───项目D
│ ├───src
│ │ └───main/java/projectD
│ │ ├───ClassC.java
│ │ └───ClassD.java
│ └───pom.xml ---- 打包 = jar & 依赖 = projectA 和 projectUtil

项目 A 依赖于项目 D,而项目 D 又依赖于项目 A,这显然是循环的。

你需要重构

  1. 在项目之间移动课程;
  2. 只需将两者合并在一起即可;
  3. 引入仅包含相互依赖的类的第三个项目(A 和 D 都依赖该项目)。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2019-05-15
    相关资源
    最近更新 更多