Зависимость библиотеки Android Gradle с зависимостью библиотеки с помощью Nexus

Я переключаю свой проект на использование Gradle и внутреннего SonaType Nexus для размещения моих зависимостей. Мой основной проект зависит от библиотечного проекта A, а библиотечный проект A зависит от библиотечного проекта B.

Моя проблема в том, что как только я добавляю LibA в свой основной проект, я получаю эту ошибку: "Версия модуля com.example:LibA:1.1 зависит от библиотек, но не является самой библиотекой"

У меня нет проблем с добавлением библиотечных проектов с зависимостями jar с помощью того же сценария сборки. Я видел, как люди успешно делали это с LOCAL (в проекте) библиотеками Android, но никто не делал этого с репозиториями Mave n.

Это ошибка в Gradle или я неправильно настроил сборку библиотеки?

Основной проект 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.+')
}

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: Добавление моего локального сценария загрузки Mave n для LibA

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

8 ответов

Решение

Эта проблема исчезла с более поздними версиями Gradle и Android Gradle Plugin. Кажется, только что была ранняя ошибка выпуска.

Если вы загрузили артефакт библиотеки для jar и aar, попробуйте это.

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

Возможно, проблема в том, что вы используете mavenCentral в качестве хранилища для библиотечных проектов.

repositories {
    mavenCentral()
}

а не ваше хранилище Nexus, где существуют реальные зависимости

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

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

Ваша линия в зависимостях для включения LibA неверна. Чтобы включить проект библиотеки, используйте это:

compile project(':LibA')

Если каталог библиотеки не находится в корне каталога вашего проекта, вам нужно указать путь, разделенный двоеточиями. Например, если ваша структура каталогов:

projectFolder
  |
  +- coreProject
  |
  +- библиотеки
      |
      + - Либа
      |
      + - LibB

Ваша зависимость будет:

compile project(':libraries:LibA')

Это то же самое, что и нотация, которую вы используете в файле settings.gradle.

Если вы не хотите, чтобы он был субмодулем в первом файле build.gradle, вы можете добавить свой локальный репозиторий maven

mavenLocal()

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

но сначала вам нужно запустить install на libA.

У меня было похожее сообщение об ошибке после введения по ошибке циклической зависимости между библиотеками:

build.gradle в обыкновенных утилитах

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

build.gradle в тестовых утилитах

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

Исправление это решило проблему. Сообщение об ошибке не очень явное.

Не знаю точно, только пара мыслей:

  1. Ты пробовал бегать gradle assemble вместо gradle build? Это должно пропустить тесты, так как я вижу, что ошибка связана с тестовым заданием.
  2. Может быть, глупо, но попробуйте удалить зависимость от 2-й библиотеки из первой и поместить ее в список основных сборок перед первой. У меня есть память о чем-то связанном. Таким образом, вторая библиотека может быть добавлена ​​в classpath, позволяя первой скомпилировать.
  3. Попробуй создать .aar файлы вручную и загрузить его в репо также вручную.
  4. Это взлом, но, может быть, это сработает: вы рассматривали, чтобы исключить это :GradleTest модуль? Смотрите раздел 50.4.7

В своей работе я использовал compile project(':google-play-services_lib') вместо compile ('google-play-services_lib') когда я объявляю зависимые проекты в моем файле build.gradle. Я думаю, что это правильный способ сделать это с Gradle: http://www.gradle.org/docs/current/userguide/dependency_management.html

Другие вопросы по тегам