Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Gradle库依赖项与使用Nexus的库依赖项_Android_Maven_Gradle_Android Studio - Fatal编程技术网

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

Android Gradle库依赖项与使用Nexus的库依赖项,android,maven,gradle,android-studio,Android,Maven,Gradle,Android Studio,我将我的项目切换到使用Gradle和内部SonaType Nexus来托管依赖项。我的核心项目依赖于库项目A,库项目A依赖于库项目B 我的问题是,一旦我将LibA添加到我的主项目中,就会出现以下错误: “com模块版本。示例:LibA:1.1依赖于库,但不是库本身” 使用相同的构建脚本添加具有jar依赖项的库项目没有问题。我见过有人用本地(在项目中)android库成功地做到这一点,但没有人用maven repos做到这一点 这是gradle中的一个bug,还是我误解了库的构建 核心项目构建 b

我将我的项目切换到使用Gradle和内部SonaType Nexus来托管依赖项。我的核心项目依赖于库项目A,库项目A依赖于库项目B

我的问题是,一旦我将LibA添加到我的主项目中,就会出现以下错误: “com模块版本。示例:LibA:1.1依赖于库,但不是库本身”

使用相同的构建脚本添加具有jar依赖项的库项目没有问题。我见过有人用本地(在项目中)android库成功地做到这一点,但没有人用maven repos做到这一点

这是gradle中的一个bug,还是我误解了库的构建

核心项目构建

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.+')
}
利巴大厦

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

在我的工作中,当我在build.gradle文件中声明依赖项目时,我使用了
编译项目(':google-play-services_-lib')
,而不是
编译('google-play-services_-lib')
。我认为这是处理Gradle的正确方法:

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

compile project(':LibA')
如果库的目录不在项目目录的根目录下,则需要指定以冒号分隔的路径。例如,如果目录结构为:

projectFolder | +--coreProject | +--libraries | +--LibA | +--LibB
这与您在settings.gradle文件中使用的符号相同。

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

mavenLocal()


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

不确定,只需考虑以下几点:

  • 您是否尝试过运行
    gradle assemble
    而不是
    gradle build
    ?这应该跳过测试,因为我看到错误与测试任务有关
  • 也许很愚蠢,但是试着从第一个库中删除对第二个库的依赖,并将其放在第一个库之前的主构建文件列表中。我对一些相关的事情有记忆。这样,可以将第二个库添加到类路径中,从而允许第一个库进行编译
  • 尝试手动创建
    .aar
    文件,并手动将其上载到repo
  • 这是一个黑客程序,但可能会奏效:您是否考虑过排除这个
    :GradleTest
    模块?看

  • 可能问题是您使用mavenCentral作为库项目的存储库

    repositories {
        mavenCentral()
    }
    
    而不是存在实际依赖关系的nexus存储库

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

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

    commons utils中的build.gradle

    dependencies {
        ...
        instrumentTestCompile project(':test-utils')
    }
    
    测试utils中的build.gradle

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

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

    如果您上载了jar和aar的库工件,请尝试此操作

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

    这个问题随着Gradle和Android Gradle插件的更高版本而消失。似乎只是早期版本的bug。

    据我所知,这是用于本地依赖项的方法,即代码实际位于项目结构中的依赖项。在我的示例中,我使用从mavencentral提取的远程依赖项和自定义maven repo。我的目标是在我的项目中避免使用本地代码,这样我就不需要子模块来更新它们了。可以从命令行运行构建并添加--info命令行选项吗?这可能会让我们更清楚地了解出了什么问题。可能是你当地的Maven回购协议设置不正确,Gradle找不到LibA。您是如何设置本地Maven repo的?是的,本地Maven repo适用于所有常规android库和JAR。我只在添加一个库项目时收到上面的错误消息,该库项目依赖另一个android库项目。在原始帖子中添加了-info错误。您如何将LibA部署到本地Maven repo中?如果您只是尝试将库项目放到其中,那么它将不起作用——您必须配置Gradle构建脚本以将AAR部署到repo中。这里有一些相关的信息,我将在上面的帖子中发布代码,如果你看到错误,请告诉我。这些是maven托管的gradle项目而不是本地源gradle项目,如果你继续阅读链接的部分,你也会看到类似的依赖声明。我看到了。还要尝试的一件事是列出依赖项()对于每个库项目,然后是核心项目,并查看差异和调试。我在核心项目上运行了命令,它实际上在我尝试构建时出现了相同的错误,因此我无法收集任何其他信息。我看到Scott在aar文件上的帖子,它触发了我的记忆。看看这篇文章:,可能会有帮助。谢谢你的链接,但我没有遇到这个问题,因为我的AAR实际上已经“远程”或由maven提供服务(这是定制的nexus)。问题是当我添加具有库依赖关系的库时会发生什么。这只是添加了一个简单且运行良好的库依赖项。Luis,我非常确定使用我的自定义maven repo与本地maven的过程完全相同-这仍然会产生我上面提到的错误。maven对不稳定的连接相当不宽容。你能试着删除m2缓存目录并再试一次吗?FWIW,Xav正在调查:FWIW,因为我的赏金没有得到一个明确的解决方案,我发布了另一个相关的SO问题,试图看看是否有一个工作配置,我们可以用它作为确定问题所在的基础:Assembly有相同的错误,我相信其中一个项目实际上被称为GradleTest。2) 我还没试过。。。但这违背了依赖关系管理的全部目的——我的项目不应该知道其他项目的依赖关系。
    dependencies {
        ...
        compile project(':commons-utils')
    }
    
    compile 'com.example:LibA:1.1.1@aar'