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

标签 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 构建

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 构建

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
        }
    }
}

最佳答案

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

compile project(':LibA')

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

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

your dependency will be:

compile project(':libraries:LibA')

这与您在 settings.gradle 文件中使用的表示法相同。

关于Android Gradle 库依赖与使用 Nexus 的库依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20061652/

相关文章:

gradle - Gradle-排除依赖项的依赖项

maven - 导入Maven依赖

Android - multiDexKeepProguard 的目的是什么?它与 gradle 中关闭的 proguardFiles 相比如何?

java - ID 为 4096 的 setInputType 被程序忽略

android - 将数据从 Activity 发送到另一个 Activity 而不启动它

java - 如何调试使用 maven 构建的 android 应用程序

java - Apache Storm - 无法找到或加载主类 org.apache.storm.starter.ExclamationTopology

java - 在 Maven 编译项目中使用 Spring AOP 获取 "No factory method ' aspectOf( )'"发现异常

gradle - 无法导入新的 Gradle 项目 : Could not install Gradle distribution from 'http://services.gradle.org/distributions/gradle-1.6-bin.zip'

安卓远程安装应用