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