【问题标题】:gradle circular dependency with external projectgradle 与外部项目的循环依赖
【发布时间】:2016-03-24 14:03:07
【问题描述】:

我有一个相当简单的设置,但它不起作用,我不知道为什么:

文件夹结构如下:

/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文件为空。

当我 gradle build MainProject 我得到:

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

(*) - details omitted (listed previously)

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

有什么提示吗?

【问题讨论】:

    标签: java gradle


    【解决方案1】:

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

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

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

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

    请尝试为每个子项目创建一个 settings.gradle 文件,其中包含以下内容:

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

    然后将 Mainproject 的 settings.gradle 文件修改为如下所示:

    include "Subproject_1", "Subproject_2"
    

    【讨论】:

    • 在我发布后大约 2 分钟意识到这一点,我去了所有项目 - 项目(':依赖')。不过还是谢谢你^^
    【解决方案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')
            }
        }
    }
    

    【讨论】:

    • 非常感谢!正是我的问题!
    【解决方案3】:

    因为依赖本身。 动起来应该没问题。

    【讨论】:

    • 我认为这应该是评论。
    【解决方案4】:

    关闭Instant run 对我有用,也可以对其他人有用。我对gradle 进行了一些更改,之后我的应用程序似乎无法运行。

    【讨论】:

      【解决方案5】:

      build.gradle (:shared)

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

      发件人:

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

      收件人:

      dependencies {
          ...
      }
      

      GL

      Source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 2020-11-18
        相关资源
        最近更新 更多