Android Gradle库依赖于使用Nexus的库依赖

时间:2013-11-19 01:52:21

标签: android maven gradle android-studio

我正在将我的项目转换为使用Gradle和内部SonaType Nexus来托管我的依赖项。我的核心项目依赖于库项目A,而库项目A依赖于库项目B.

我的问题是,只要我将LibA添加到我的主项目中,我就会收到此错误: “模块版本com.example:LibA:1.1依赖于库,但不是库本身”

使用相同的构建脚本添加带有jar依赖项的库项目没有问题。我见过人们用LOCAL(在项目中)成功地做了这个android库,但没有人用maven repos做这件事。

这是gradle中的错误还是我错误配置了库构建?

核心项目构建

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'android'

repositories {
    maven {
        url "http://localhost:8081/nexus/content/repositories/releases/"
    }

    maven {
        url "http://localhost:8081/nexus/content/repositories/central/"
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
    }
}

dependencies {
    compile 'com.android.support:support-v4:+'
    compile('com.example:LibA:1.+')
}

LibA Build

buildscript {
    repositories {
        mavenCentral()
    }

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

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 17

        versionCode = "3"
        versionName = "1.2"
    }

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

        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        compile ('com.example:LibB:1.+')
    } ...

LibB Build

buildscript {
    repositories {
        mavenCentral()
    }

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

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 17

        versionCode = "1"
        versionName = "1.0"
    }

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

        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
    } ...

编辑:为错误添加-info输出。

* What went wrong:
A problem occurred configuring project ':GradleTest'.
> Failed to notify project evaluation listener.
   > Module version com.example:LibA:1.+ depends on libraries but is not a library itself

编辑2:为LibA添加本地maven上传脚本

apply plugin: 'maven'
apply plugin: 'signing'

group = "com.example"
version = defaultConfig.versionName

configurations {
    archives {
        extendsFrom configurations.default
    }
}

signing {
    required { has("release") && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}


uploadArchives {
    configuration = configurations.archives
    repositories.mavenDeployer {
        beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
        repository(url: sonatypeRepo) {
            authentication(userName: sonatypeUsername,
                    password: sonatypePassword)
        }

        pom.project {
            name 'com-example'
            packaging 'aar'
            description 'none'
            url 'https://internal github link'

            scm {
                url 'scm:git@https://internal github link'
                connection 'git@https://internal github link'
                developerConnection 'git@https://internal github link'
            }

            licenses {
                license {
                    name 'example'
                    url 'example'
                    distribution 'example'
                }
            }

            developers {
                developer {
                    id 'example'
                    name 'example'
                    email 'example'
                }
            }

            groupId "com.example"
            artifactId rootProject.name //LibA
            version defaultConfig.versionName
        }
    }
}

8 个答案:

答案 0 :(得分:2)

包含LibA的依赖项中的行是错误的。要包含库项目,请使用:

compile project(':LibA')

如果库的目录不在项目目录的根目录下,则需要指定以冒号分隔的路径。例如,如果您的目录结构是:

projectFolder
  |
  +--coreProject
  |
  +--libraries
      |
      +--LibA
      |
      +--LibB

您的依赖关系将是:

compile project(':libraries:LibA')

这与您在settings.gradle文件中使用的符号相同。

答案 1 :(得分:2)

也许问题是您使用mavenCentral作为库项目的存储库

repositories {
    mavenCentral()
}

而不是你的nexus存储库,其中存在实际的依赖关系

repositories {
    maven {
        url "http://localhost:8081/nexus/content/repositories/releases/"
}

    maven {
        url "http://localhost:8081/nexus/content/repositories/central/"
    }
}

答案 2 :(得分:2)

如果您为jar和aar上传了库工件,请尝试此操作。

compile 'com.example:LibA:1.1.1@aar'

答案 3 :(得分:1)

在我的工作中,当我在build.gradle文件中声明依赖项目时,我使用了compile project(':google-play-services_lib')而不是compile ('google-play-services_lib')。我认为这是使用Gradle执行此操作的正确方法:http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:project_dependencies

答案 4 :(得分:1)

如果您不想将其作为第一个build.gradle文件中的子模块,则可以添加本地maven存储库

mavenLocal()

//repositories
repositories {
    mavenCentral()
    mavenLocal()
}

但您需要先在libA上运行install。

答案 5 :(得分:1)

不确定,只是一些想法:

  1. 您是否尝试过gradle assemble代替gradle build?这应该跳过测试,因为我发现错误与测试任务有关。
  2. 也许是愚蠢的,但是尝试从第一个lib中删除对第二个lib的依赖,然后将它放到第一个之前的主构建文件列表中。我记得有关的事情。这样就可以将第二个lib添加到classpath中,允许第一个lib编译。
  3. 尝试手动创建.aar个文件,并手动将其上传到repo。
  4. 这是一个黑客,但也许它会工作:你考虑过排除这个:GradleTest模块吗?请参阅section 50.4.7

答案 6 :(得分:1)

在库之间错误地引入了循环依赖后,我收到了类似的错误消息:

commons-utils中的build.gradle

dependencies {
    ...
    instrumentTestCompile project(':test-utils')
}

test-utils中的build.gradle

dependencies {
    ...
    compile project(':commons-utils')
}

解决这个问题解决了这个问题。错误消息不是很明确。

答案 7 :(得分:0)

Gradle和Android Gradle Plugin的更高版本已经消除了这个问题。似乎只是一个早期发布的bug。