与外部项目的循环依赖

时间:2016-03-24 14:03:08

标签: java gradle

我有一个相当简单的设置,这不起作用,我无法解决原因:

文件夹结构如下:

/dependency
    /build.gradle
    /settings.gradle
    /src/main/...

/Mainproject
    /build.gradle
    /settings.gradle

    /Subproject_1
        /build.gradle
        /src/main...

     /Subproject_2
        /build.gradle
        /src/main...

我希望子项目依赖于"依赖"在本地进行快速测试。 所以我坚持使用手册并做了:

/Mainproject/settings.gradle:

include "Subproject_1", "Subproject_2", "dependency"
project(":dependency").projectDir = file('../dependency')

/Mainproject/build.gradle:

allprojects {
    apply plugin: 'java'
    dependencies {
        compile project(path: ':dependency')
    }
}

dependencies {
    compile project(':Subproject_1')
    compile project(':Subproject_2')
}

/dependency/build.gradle:

version '1.0'
apply plugin: 'java'

repositories {
    maven {
        url "http://...."
    }
}

dependencies {
    compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
    compile group: 'javax', name: 'javaee-api', version: '7.0'
}

jar {
    manifest {
        attributes 'Implementation-Title': 'Archive delegation dispatcher classes',
                'Implementation-Version': project.version
    }
}

Subproject_1和_2的build.gradle文件为空。 依赖项的settings.gradle文件为空。

当我开始构建MainProject时,我得到:

Circular dependency between the following tasks:
:dependency:classes
\--- :dependency:compileJava
     \--- :dependency:jar
          \--- :dependency:classes (*)

(*) - details omitted (listed previously)

我无法理解为什么会这样。

任何提示?

5 个答案:

答案 0 :(得分:3)

当您在Mainproject的settings.gradle文件中include "dependency"时,您正在将“依赖项”项目作为“Mainproject”的子项目。

然后,Mainproject的build.gradle文件中的这个块将“dependency”定义为所有子项目的编译依赖项。

allProjects {
    dependencies {
        compile project(path: ':dependency')
    }
}

由于“依赖”项目也是一个子项目,因此您定义了一个循环依赖项,其中“依赖项”项目依赖于它自己。

相反,请尝试使用以下内容为每个子项目创建settings.gradle文件:

include "dependency"
project(":dependency").projectDir = file('../dependency')

然后将Mainproject的settings.gradle文件修改为:

include "Subproject_1", "Subproject_2"

答案 1 :(得分:2)

您已声明allProjects依赖项目dependency,如下所示:

allprojects {
    apply plugin: 'java'
    dependencies {
        compile project(path: ':dependency')
    }
}

您需要将此选项仅应用于不是 dependency的项目。您可以通过在应用依赖项时将其排除来实现,例如

subprojects { project ->
    if (project.name != "dependency") {
        apply plugin: 'java'
        dependencies {
            compile project(path: ':dependency')
        }
    }
}

答案 2 :(得分:1)

因为依赖关系本身。 移动它必须没问题。

答案 3 :(得分:0)

关闭Instant run对我有用,也可能对其他人有用。我做了一些与gradle相关的更改,之后我的应用程序似乎无法正常工作。

答案 4 :(得分:0)

build.gradle(:shared)

这是因为您试图在自己内部包含一个模块。

发件人:

dependencies {
    implementation project(':shared')
    ...
}

收件人:

dependencies {
    ...
}

GL

Source