我正在将我的项目转换为使用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
}
}
}
答案 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)
不确定,只是一些想法:
gradle assemble
代替gradle build
?这应该跳过测试,因为我发现错误与测试任务有关。.aar
个文件,并手动将其上传到repo。: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。