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

我将我的项目切换到使用Gradle和一个内部的SonaType Nexus托pipe我的依赖关系。 我的核心项目取决于库项目A和库项目A对库项目B有依赖性。

我的问题是,只要我添加的LibA到我的主项目,我得到这个错误:“模块版本com.example:LibA:1.1依赖于库,但不是一个库本身”

使用相同的构build脚本添加具有jar依赖关系的库项目是没有问题的。 我已经看到人们用LOCAL(在项目中)android库成功地做到这一点,但没有人用maven回购。

这是一个在gradle中的错误,或者我误configuration了库构build?

核心项目build设

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.+') } 

利比亚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.+') } ... 

利比亚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 } } } 

Solutions Collecting From Web of "Android Gradle库依赖与库依赖使用Nexus"

您的依赖线中包含LibA是错误的。 要包含一个库项目,使用这个:

 compile project(':LibA') 

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

 projectFolder
   |
   +  -  coreProject
   |
   +  - 库
       |
       +  - 力霸
       |
       +  -  LibB

你的依赖将是:

 compile project(':libraries:LibA') 

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

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

 repositories { mavenCentral() } 

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

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

如果你上传jar和aar的库文物,试试这个。

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

在我的工作中,当我在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

如果你不想把它作为第一个build.gradle文件中的子模块,你可以添加你的本地Maven仓库

mavenLocal()

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

但是你需要先在libA上运行安装。

错误地引入了库之间的循环依赖关系之后,我有一个类似的错误信息:

build.gradle中的commons-utils

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

在test-utils中build.gradle

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

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

不知道,只有几个想法:

  1. 你有没有尝试过运行gradle assemble而不是gradle build ? 这应该跳过testing,因为我看到错误与testing任务有关。
  2. 也许愚蠢的,但尝试从第一个删除第二个lib的依赖,并把它放在你的主要构build文件列表之前的第一个。 我有一些相关的记忆。 这样,第二个lib可以被添加到类path,允许第一个编译。
  3. 尝试手工创build.aar文件,并手动上传到回购。
  4. 这是一个黑客,但也许它会工作:你有没有考虑排除这个:GradleTest模块? 参见第50.4.7节

Gradle和Android Gradle Plugin的更新版本已经消失了这个问题。 似乎只是一个早期版本的错误。