在 gradle 添加时项目之间的循环引用

Circular reference between projects when adding at gradle

我正在向我的 Android peoject 添加一个 Easypost 库,据我所知,我需要在 settings.gradle 和 build.gradle 中引用它。但是当我这样做时,我得到了错误:

Error:Circular reference between projects: 
:Libs:easypost-java-master -> :Libs:easypost-java-master

如果我删除了其中任何一个的引用,我可以无误地同步但无法导入 com.easypost.EasyPost。所以我猜我确实需要在这两个地方进行引用,但是如何避免循环引用错误呢?

Settings.Gradle

include ':app'
include ':Libs:easypost-java-master'

Build.Gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile project(':Libs:easypost-java-master')
}

我的项目结构

Project Structure

从 Settings.gradle 中删除 ':Libs:easypost-java-master' 并从 build.gradle 中删除 compile project(':Libs:easypost-java-master')

如果您将库放在 "libs" 中,行 compile fileTree(dir: 'libs', include: ['*.jar']) 会将其添加到构建步骤中。

您可以根据您的依赖问题适当添加以下代码段:

compile 'dep1' {
  exclude module: 'dep2' 
}
compile 'dep2' {
  exclude module: 'dep1' 
}

如果不是直截了当,就按照逻辑来。它也是一个删除依赖项的选项,因为它是一个子依赖项。

您标记的 build.gradle 文件包含对自身作为依赖项的引用。这是最短的循环引用。如果你删除

compile project(':Libs:easypost-java-master')

可能没事。我说 可能 因为我放弃了 IntelliJ Idea。它没有让 Gradle 的事情变得更简单,它只是引入了一个额外的、冗余的复杂层,而我已经处理过。 IntelliJ Idea 只是不适合我。

我能给出的最佳建议是先手动设置您的项目,以便了解 gradle 如何处理项目。这是一个陡峭的学习曲线,但就我而言,它在漫长的 运行.

中节省了更多的时间和麻烦。

您正在将库引用放在库中的 build.gradle 中。你应该把它放在 app build.gradle 文件中。

settings.gradle 将尝试获取库的 build.gradle。然后它将尝试编译它,但它包含对自身的引用。因此,当它尝试编译该引用时,它会获取相同的 build.gradle 文件,尝试编译并找到对自身的引用......等等。

移动这一行:

compile project(':Libs:easypost-java-master')

你的 app build.gradle 你应该没问题。

只需确保您在应用的 build.gradle 文件和 Gradle 脚本的 settings.gradle 文件中使用了完全相同的名称。

如 build.gradle 文件中的 compile project(':lib') 和 settings.gradle 文件中的 include ':sample', ':lib' 两者都应具有相同的库模块名称 ':lib'

这将解决问题。