Переходные зависимости не разрешены для библиотеки aar с использованием gradle
Я исследовал некоторое время и, вероятно, видел самые популярные ответы здесь, связанные с ААР и транзитивных зависимостей, но почему-то мне все еще не ясно, как заставить это работать.
Так:
У меня есть библиотека Android с данной конфигурации Gradle:
apply plugin: 'android-library'
apply plugin: 'android-maven'
version = "1.0.0"
group = "com.somepackage"
buildscript {
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
classpath 'com.github.dcendents:android-maven-plugin:1.0'
}
}
android {
compileSdkVersion 19
buildToolsVersion '19.0.3'
defaultConfig {
minSdkVersion 10
}
}
repositories {
maven { url 'http://www.bugsense.com/gradle/' }
}
dependencies {
provided 'com.google.android.gms:play-services:+'
provided 'com.android.support:appcompat-v7:+'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.bugsense.trace:bugsense:3.6'
compile 'commons-net:commons-net:3.3'
}
Затем я внедряю его в локальный репозиторий Maven с gradle install
, POM-файл развернутой библиотеки выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sprezzat</groupId>
<artifactId>app</artifactId>
<version>1.0.0</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.bugsense.trace</groupId>
<artifactId>bugsense</artifactId>
<version>3.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
И, наконец, Gradle config моего приложения для Android, используя вышеуказанную библиотеку в качестве зависимости:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
mavenLocal()
}
android {
compileSdkVersion 15
buildToolsVersion "19.0.2"
defaultConfig {
minSdkVersion 10
targetSdkVersion 18
}
}
dependencies {
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:appcompat-v7:+'
compile 'com.somepackage:LIBRARY_NAME:1.0.0@aar'
}
И после развертывания приложения на телефоне я получаю NoClassDefFoundError
для классов, принадлежащих компилировать зависимости моей библиотеки Android.
Проверка моих зависимостей приложений Android с помощью gradle dependencies
:
apk - Classpath packaged with the compiled main classes.
+--- com.google.android.gms:play-services:+ -> 4.3.23
| \--- com.android.support:support-v4:19.0.1 -> 19.1.0
+--- com.android.support:appcompat-v7:+ -> 19.1.0
| \--- com.android.support:support-v4:19.1.0
\--- com.somepackage:LIBRARY_NAME:1.0.0
Согласно приведенному выше дереву, все переходные зависимости не обнаружены. Где проблема и как это сделать правильно?
8 ответов
Я решил свою проблему, установив transitive
атрибут для моей зависимости aar:
compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
transitive=true
}
Вы не должны использовать "@aar", если "@" становится " нотацией только для артефактов", если вы хотите использовать "@" и хотите иметь переходную зависимость, вы должны добавить "transitive=true"
Попробуйте это, если вы используете aar локально:
compile(project(:your-library-name)) {
transitive=true
}
У меня была аналогичная проблема, и я чувствовал, что могу поделиться шагами по ее решению.
Основная идея невозможности использовать транзитивные зависимости при публикации собственных aar
на самом деле не имеет .pom
файл, созданный с ожидаемыми транзитивными зависимостями.
Я использовал 'maven-publish'
плагин для моего андроида aar
зависимость опубликовать его в моем собственном частном репозитории maven. Переходные зависимости не были разрешены, когда другие мои проекты добавляли моиaar
зависимость в их build.gradle
. Вот что я сделал, чтобы изменить.pom
файл при публикации моего aar
.
Здесь важно отметить, что зависимости, которые вы хотите иметь переходное поведение, должны быть импортированы с использованием api
в вашем библиотечном проекте build.gradle
файл, подобный следующему.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api 'com.android.volley:volley:1.0.0'
api "com.google.code.gson:gson:$globalGsonVersion"
}
Как я уже сказал ранее, я использовал maven-publish
плагин для публикации aar
зависимость и, следовательно, моя задача публикации в градиенте выглядит следующим образом.
publishing {
publications {
mavenAar(MavenPublication) {
from components.android
}
mavenJava(MavenPublication) {
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
// Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each
configurations.api.allDependencies.each {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
repositories {
maven {
// Your repository information goes here
}
}
}
Следовательно, я использовал другой mavenJava
задача опубликовать .pom
файл в моем частном репозитории maven, чтобы, когда aar
добавляется как зависимость к какому-то другому модулю, он получает .pom
информацию и загрузите транзитивную зависимость.
Чтобы завершить ответ, вот как вы должны добавить зависимость в build.gradle
файл для вашего собственного опубликованного aar
мне импортированный.
api('com.example.masudias:my_lib:1.0.0@aar') {
transitive = true
}
transitive
означает, что потребитель (например, приложение) включает производителя и все зависимости производителя (например, библиотеки). Это увеличивает время сборки и может создать некоторые проблемы с версиями зависимостей.
По умолчанию зависимость Gradle имеет transitive = true
api ('com.package:library:0.0.1')
//the same
api ('com.package:library:0.0.1') {
transitive = true
}
Когда вы используете @artifact notation
она имеет transitive = false
api ('com.package:library:0.0.1@aar')
//the same
api ('com.package:library:0.0.1@aar') {
transitive = false
}
Файл AAR не содержит транзитивных зависимостей. Так что даже если использовать API вместо реализации, это не сработает.
В нашей команде мы разработали библиотеку для использования в наших приложениях, и мы хотели, чтобы она предназначалась только для внутреннего использования. Раньше мы включали целый модуль, который вроде бы работал. Позже мы решили перейти к файлу aar, но столкнулись с той же проблемой classpath not found . После некоторых исследований мы узнали, что мы также можем использовать локальное репозиторий maven. Мы решили этим воспользоваться.
Вот пошаговый процесс
Публикация репозитория
1. В корневом файле build.gradle вашей библиотеки необходимо включить
id 'com.github.dcendents.android-maven' version '2.0' apply false
2. В файле build.gradle уровня модуля вашей библиотеки вам нужно добавить
а) В плагинах
id 'maven-publish'
б) В нижней части файла градиента добавить
publishing {
publications {
release(MavenPublication) {
groupId = 'com.demo.android'
artifactId = 'qrcodescanner'
version = '1.0.0'
afterEvaluate {
from components.release
}
}
}
repositories {
maven {
name = "qrcodescanner"
url = "${project.buildDir}/repo"
}
}
}
3. В зависимости от имени, которое вы дали, будут созданы задачи gradle, которые вы можете проверить с помощью задач gradlew или с помощью окна gradle в верхнем правом углу в студии Android. Наш был
publishReleasePublicationToQrcodescannerRepository
4. Запустите его, и репо будет создано по заданному пути.
gradlew publishReleasePublicationToQrcodescannerRepository
Последний шаг, который вам нужно опубликовать на maven local, используя
gradlew publishToMavenLocal
если это не сработает, вы можете попробовать gradlew clean и gradlew build перед его выполнением.
Использование локального репо
1. Вам нужно добавить mavenLocal() в файл build.gradle корневого уровня вашего проекта, в котором вы хотели его использовать, прежде чем другие центральные репозитории.
allprojects {
repositories {
mavenLocal()
google()
jcenter()
maven { url "https://jitpack.io" }
mavenCentral()
}
}
- Теперь вам нужно включить свою зависимость в проект, как мы это делаем с другими зависимостями.
implementation 'com.demo.android:qrcodescanner:1.0.0'
имейте в виду, что формат должен groupdId:artifactId:version
Вот и все.
Использованная литература :
Для меня полное издательское решение выглядит так:
apply plugin: 'com.github.dcendents.android-maven'
group = GROUP
version = VERSION
// you could move it to env variable or property
def publishFlavorless = true
def firstTask = null
android.libraryVariants.all { variant ->
if (variant.name.toLowerCase().contains("debug")) {
// Workaround for https://github.com/gradle/gradle/issues/1487
if (publishFlavorless && firstTask == null) {
def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
firstTask = bundleTask
artifacts {
archives(firstTask.archivePath) {
builtBy firstTask
name = project.name
}
}
}
return
}
def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
artifacts {
archives(bundleTask.archivePath) {
classifier variant.flavorName
builtBy bundleTask
name = project.name
}
}
}
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom.project {
name POM_NAME
artifactId POM_ARTIFACT_ID
// For aar it is equal to 'aar' with jar transitive dependencies won't work
packaging POM_PACKAGING
description POM_DESCRIPTION
}
}
}
transitive = true
блок также требуется...
Простое добавление @aar в конце зависимости - вот что у меня сработало.
dependencies {
implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}