【问题标题】:Can't compile Android project with gradle after adding a library添加库后无法使用gradle编译Android项目
【发布时间】:2014-03-11 10:47:10
【问题描述】:

在向我的 Android 项目添加库之前,布局是这样的:

  • MyappProject
    • 我的应用程序
      • build.gradle
  • settings.gradle
  • build.gradle

顶层 build.gradle 一直是空的,settings.gradle 文件只包含:

include ':Myapp'

我获得了一个库项目,我能够成功地将它导入 Android Studio,所以我认为其中的 gradle 文件很好。我现在有以下结构:

  • MyappProject
    • 我的应用程序
      • build.gradle
      • 图书馆
        • 库子项目1
          • build.gradle
        • ....
        • build.gradle
  • settings.gradle
  • build.gradle

...顶级设置 gradle 现在看起来像:

include ':Myapp'
include ':libraries:Library'

我还更新了 Myapp 的 build.gradle,因此它在此处的依赖项中包含了额外的最后一行:

dependencies {
    compile 'com.android.support:support-v4:+'
    compile files('libs/commons-lang3-3.1.jar')
    compile files('libs/jsoup-1.7.3.jar')
    compile project(':libraries:Library')
}

不幸的是,任何使用 gradle 做任何事情(同步文件、构建等)的尝试现在都会让我得到以下结果:

Gradle 'MyappProject' project refresh failed:
     Configuration with name 'default' not found.
     Gradle settings

对设置的任何更改似乎都没有效果,Android Studio 将设置保持为“使用默认 gradle 包装器”。 据我了解,这意味着顶层 build.gradle 存在问题,该文件不包含构建子项目的足够信息。但是,也许我误解了,因为 Myapp 用来构建和 Library 似乎也很好。删除 compile project(':libraries:Library') 允许 gradle 文件再次同步,但我想使用该库...

欢迎任何有关如何解决此问题的建议。

已编辑以从库中添加 build.gradle。顶级:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}

allprojects {
    version = VERSION_NAME
    group = GROUP

    repositories {
        mavenCentral()
    }
}

从下一级开始:

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'

【问题讨论】:

  • 听起来:libraries:Library 没有(隐式或显式)声明default 配置,在这种情况下,无法使用项目依赖项来引用它。
  • 谢谢。我一直在查看 gradle 文档,但我不清楚如何声明配置。请您介意指点我应该阅读的内容吗?
  • 你能从图书馆项目中展示你的 build.gradle 吗?
  • 我已按要求添加了一些 build.gradle 文件。
  • 您不必手动声明default 配置; android-library 插件应该可以解决这个问题。我不知道这个插件是如何工作的细节,但是你在学习了官方的 Gradle Android 插件文档之后应该能够找到解决方案,其中包含很多关于项目依赖等的信息。

标签: android gradle android-studio


【解决方案1】:

您不能在 Android Studio 的项目中拥有项目。您只能拥有模块,因此如下所示更改您的项目结构,使其符合允许的项目 - 模块级结构。

MyappProject
   Myapp
    build.gradle
   libraries
    LibrarySubProject1
     build.gradle
     ....
settings.gradle
build.gradle(Root only one)

现在对您的 build.gradle 文件执行以下操作

1.根级build.gradle 文件

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}

repositories {
    mavenCentral()
}

如果您的库项目的根级别 build.gradle 文件中有某些内容,则也将其包含在此根级别 build.gradle 文件中,因为只允许 root 拥有,它将自动包含在每个子级别的 build.gradle 文件中编译时。

2。 LibraryProject 的build.gradle 文件

apply plugin: 'android-library'

    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.3"

        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 19
        }

        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }

            instrumentTest.setRoot('tests')

            debug.setRoot('build-types/debug')
            release.setRoot('build-types/release')
        }
    }

    apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'

3.您的主模块的 build.gradle 文件应如下所示

apply plugin: 'android'

        android {
            compileSdkVersion 19
            buildToolsVersion "19.0.3"

            defaultConfig {
                minSdkVersion 14
                targetSdkVersion 19
            }
       }

       dependencies {
           //YOUR MODULE DEPENDENCIES
           compile project(':libraries:LibrarySubProject1')
       }

你的settings.gradle 文件会是这样的

  include ':Myapp'
  include ':libraries:LibrarySubProject1'

【讨论】:

    【解决方案2】:

    在我的情况下,只需删除包含的行即可解决问题

    maven_push.gradle
    

    这一行正在尝试将项目上传到 maven,而我不需要。

    【讨论】:

      【解决方案3】:

      您的库具有多模块构建文件结构:

      Library
          LibrarySubProject1
              build.gradle
          ....
          build.gradle
      

      像 Android Studio 制作的项目一样具有两级 build.gradle 文件结构,但这不适用于库。 MyApp 正在引入 :libraries:Library 的依赖项,但只能看到带有 buildscriptallprojects 标记的顶级构建文件,它不能在其中找到要依赖的默认配置。

      您的库不能有一个 settings.gradle 文件来引导到 LibrarySubProject1/build.gradle。您需要将库上移一级目录到 Library,然后将两个 build.gradle 文件合并为一个:

      buildscript {
          repositories {
              mavenCentral()
          }
      
          dependencies {
              classpath 'com.android.tools.build:gradle:0.9.+'
          }
      }
      
      repositories {
          mavenCentral()
      }
      
      apply plugin: 'android-library'
      
      android {
          compileSdkVersion 19
          buildToolsVersion "19.0.3"
      
          defaultConfig {
              minSdkVersion 14
              targetSdkVersion 19
          }
      
          sourceSets {
              main {
                  manifest.srcFile 'AndroidManifest.xml'
                  java.srcDirs = ['src']
                  resources.srcDirs = ['src']
                  aidl.srcDirs = ['src']
                  renderscript.srcDirs = ['src']
                  res.srcDirs = ['res']
                  assets.srcDirs = ['assets']
              }
      
              instrumentTest.setRoot('tests')
      
              debug.setRoot('build-types/debug')
              release.setRoot('build-types/release')
          }
      }
      
      apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'
      

      我不确定如何处理您在顶级 build.gradle 中执行的 VERSIONGROUP 内容;你必须弄清楚这一点。

      【讨论】:

        【解决方案4】:

        我刚刚注释掉了一行:
        申请自:rootProject.file('gradle/maven-push.gradle') in build.gradle(:library) 因为我根本不想发布这个项目,但我需要它作为一个库。

        【讨论】:

        • 我看不出这如何回答本页顶部的问题,但它应该。请edit根据How to Answer或删除答案。否则,它可能会被标记为“不是答案”并被删除。
        猜你喜欢
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 2015-02-01
        • 2018-04-14
        • 2016-04-25
        • 2013-09-09
        相关资源
        最近更新 更多