在 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')
}
我的项目结构
从 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'
。
这将解决问题。
我正在向我的 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')
}
我的项目结构
从 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'
。
这将解决问题。