Я хочу разработать «автономную» библиотеку, которая будет использоваться в других библиотеках.
Вот изображение, иллюстрирующее сценарий использования, который я хочу построить:
Пояснения
Я разработал CommonLib с использованием сетевых зависимостей, таких как OkHttp, Gson и т. Д. Эта часть сделана спроект Android Studio создал файл aar (и он работает хорошо, спасибо;))
Теперь я хочу использовать этот CommonLib внутри других библиотек с наиболее прозрачным способом, который я могу сделать,Например, я не хочу указывать зависимости okHttp в моем проекте Lib 1 или в проекте My App .
CommonLib
В двух словах, эта библиотека разработана с Kotlin и отвечает за центральный процесс, который я хочу легко использовать повторно.Я показываю вам блок зависимостей моего файла Gradle:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion"
implementation "com.google.code.gson:gson:$gsonVersion"
implementation "com.android.support:support-annotations:$supportLibVersion"
implementation "com.squareup.okhttp3:okhttp:$okhttpVersion"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttpVersion"
testImplementation "org.robolectric:robolectric:$robolectricVersion"
testImplementation "junit:junit:$junitVersion"
}
Решение 1 (лучшее, что я думаю): Частный репо
IЯ настроил плагин Maven в проекте CommonLib , чтобы опубликовать мой файл aar в частном репозитории (я использую Nexus, но это не проблема).Вот мой файл gradle:
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
repository(url: "$url") {
authentication(userName: "$user", password: "$password")
}
pom.groupId = "com.test.common"
pom.artifactId = "CommonLib"
pom.version = VERSION_NAME + "." + VERSION_CODE
}
}
}
Процесс загрузки работает хорошо, и в моем репозитории я могу найти артефакт CommonLib и связанный файл 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.test.common</groupId>
<artifactId>CommonLib</artifactId>
<version>0.3.1</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-android-extensions-runtime</artifactId>
<version>1.3.31</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.3.31</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>appcompat-v7</artifactId>
<version>28.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.12.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>3.11.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Моя проблема: когда я добавляю эту зависимость артефакта в проект Lib 1 , процесс компиляции завершился неудачно из-за NoClassDefFoundError
и I'mне единственный .
Если быть более точным, я даю вам конфигурацию проекта Lib 1 .
allprojects {
repositories {
google()
jcenter()
maven {
url "$url"
}
}
}
и
dependencies {
[...]
implementation 'com.test.common:CommonLib:0.3.1'
}
Сообщение об ошибке сборки:
Неразрешенная ссылка: имя_пакета
имя_пакета - это пакет, присутствующий в CommonLib
Решение 2 (неплохое): подмодули Android Studio
Теперь, в Lib 1 проекте, я добавляю свой Проект CommonLib как модуль Android Studio.Импорт в порядке, время сборки / компиляции в порядке.Но (к сожалению, есть одно «но»), когда я генерирую свой окончательный файл aar, методы и объекты из CommonLib не внедряются, и я не могу его использовать: (
Решение 3 (самое уродливое): копировать / вставить код
Наконец, я копирую / вставляю исходный код CommonLib внутри Lib 1 проекта.Ха-ха! Это работает! [Вставьте печальный / стыд / слезы смайлик здесь]
Лучшее решение
Ну, я не знаю, и мне нужна ваша помощь,ребята ... Что я могу сделать?