Временные зависимости проекта библиотеки Android теряют тип AAR

Я работаю над проектом, который включает в себя два проекта библиотеки Android. Когда я загружаю эти библиотеки в свой репозиторий Maven (Nexus), сгенерированный pom не включает элемент <type>aar</type> в зависимость.

Вот мое дерево зависимостей

* App1
 \
  * lib1
  |\
  | * lib2
  * Other libs

На этой диаграмме видно, что мой app зависит от lib1, который зависит от lib2. Обе библиотеки являются проектами библиотек Android, то есть AAR.

Библиотека 1/build.gradle

apply plugin: 'com.android.library'
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    provided project(':lib2')

    compile 'com.squareup.picasso:picasso:2.3.3'
}

Lib2/build.gradle

apply plugin: 'com.android.library'
apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion 19
        versionCode 1
        versionName '1.0'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
    compile 'com.squareup.retrofit:retrofit:1.6.1'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
    compile 'com.squareup.okhttp:okhttp:2.0.0'
}

Обратите внимание, как Lib1 включает Lib2 в качестве зависимости project().

Теперь, когда я развертываю это с помощью отличного плагина gradle-mvn-push Криса Бейнса, все работает, как и ожидалось. В сгенерированном pom.xml я заметил только одну странность.

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>lib2</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    ...
</dependencies>

Обратите внимание, что подключаемый модуль mavenDeployer пропустил элемент <type>aar</type> в зависимости при создании файла pom.

В моем проекте приложения (который является проектом maven) у меня есть эта зависимость:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>lib1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>aar</type>
    </dependency>
    ...
</dependencies>

При попытке построить это с помощью Maven я получаю следующую ошибку.

Could not resolve dependencies for project com.example:app:apk:1.0.0-SNAPSHOT: The following artifacts could not be resolved: com.example:lib2:jar:0.0.1-SNAPSHOT

Обратите внимание, как он ищет jar-версию библиотеки. Я считаю, что, поскольку плагин mavenDeployer не генерирует <type>aar</type> в списке зависимостей сгенерированного pom, maven по умолчанию ищет банку.

Кто-нибудь знает, как создавать проекты библиотек Android, которые включают временные зависимости с помощью Gradle?


person rharter    schedule 24.09.2014    source источник


Ответы (2)


Просто добавьте aar в pom с помощью любого текстового редактора. После этого откройте консоль в корне проекта (там, где находится pom) и запустите «mvn clean install». Артефакт aar будет сгенерирован и развернут в вашем репозитории maven.

В любом случае гораздо проще создавать библиотеки aar с помощью Maven. Просто создайте проект Maven, используя любой архетип библиотеки Android (de.akquinet довольно хороши, но вы должны использовать версию плагина между 3.8.2 и 3.9, http://mvnrepository.com/artifact/de.akquinet.android.archetypes). Просто создайте проект, добавьте библиотеки, а затем запустите команду «mvn clean install», чтобы установить их в локальный каталог maven. После этого просто используйте их как обычные зависимости aar.

person Fco P.    schedule 15.01.2015
comment
Проблема заключается не в создании проектов библиотек, а в том, что проект библиотеки с зависимостями от других библиотек AAR при развертывании с использованием mavenDeployer (uploadArchives) не сохраняет часть ‹type›aar‹/type› элемента зависимости в pom, поэтому maven пытается разрешить эти временные зависимости как jar-файлы (по умолчанию). - person rharter; 15.01.2015
comment
Я понимаю. Но если предположить, что все остальное в pom в порядке, простое добавление отсутствующего типа и запуск maven вручную сгенерируют aars. - person Fco P.; 15.01.2015
comment
Конечно, но в этот момент я вручную создаю свои зависимости, что сводит на нет преимущество автоматического управления зависимостями, для которого я использую maven. Мне нужно иметь возможность распространять библиотеки, которые зависят от других библиотек, без оговорки о том, что каждый пользователь должен вручную загружать зависимости, изменять pom и создавать их локально. - person rharter; 16.01.2015

Попробуйте градл-фьюри. Он исправляет все эти... гм... вещи. В частности, недопустимые и/или неточные pom, сгенерированные gradle. Подтвержденное рабочее решение для публикации в sonatype oss/maven Central. Никаких ручных правок pom, поддержка подписи pgp и многое другое.

Сайт: https://github.com/gradle-fury/gradle-fury

В частности, вам нужен скрипт gradle maven-support, который сделает всю работу за вас. Все, что обычно находится в pom, хранится в gradle.properties. Также поддерживаются варианты Android, военные файлы (скоро исправления для distZip), javadocs и исходные файлы jar и многое другое.

Отказ от ответственности, я работаю над этим

Редактировать: еще один лакомый кусочек информации. Хотя Fury вводит зависимости и корректирует типизацию для библиотек AAR, плагин gradle-android (то, что делает Google) не учитывает раздел зависимостей и игнорирует его. В основном транзитивные зависимости проектов AAR не поддерживаются. Не знаю, почему

person spy    schedule 13.10.2016