Android库项目瞬态依赖松散AAR类型
Posted
技术标签:
【中文标题】Android库项目瞬态依赖松散AAR类型【英文标题】:Android library project transient dependencies loose AAR type 【发布时间】:2014-11-19 11:41:54 【问题描述】:我正在开发一个包含两个 android 库项目的项目。当我将这些库上传到我的 Maven 存储库 (Nexus) 时,生成的 pom 不会在依赖项中包含 <type>aar</type>
元素。
这是我的依赖树
* App1
\
* lib1
|\
| * lib2
* Other libs
您可以在此图中看到我的app
依赖于lib1
,而lib1
又依赖于lib2
。这两个库都是 Android 库项目,因此是 AAR。
Lib1/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()
依赖项。
现在,当我使用 Chris Banes 出色的 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 插件在生成 pom 时遗漏了依赖项中的 <type>aar</type>
元素。
在我的应用项目(这是一个 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 插件未在生成的 pom 的依赖项列表中生成 <type>aar</type>
,因此 maven 默认会查找 jar。
有人知道如何使用 Gradle 构建包含临时依赖项的 Android 库项目吗?
【问题讨论】:
【参考方案1】:只需使用任何文本编辑器将 aar 添加到 pom 中。之后,打开一个控制台进入项目的根目录(pom 所在的位置)并运行“mvn clean install”。将生成 aar 工件并将其部署到您的 maven 存储库。
无论如何,使用 Maven 创建 aar 库要容易得多。只需使用任何 android 库原型创建一个 Maven 项目(de.akquinet 非常好,但您必须使用 3.8.2 和 3.9 之间的插件版本,http://mvnrepository.com/artifact/de.akquinet.android.archetypes)。只需创建项目,添加库,然后运行命令“mvn clean install”将它们安装到本地 maven 目录中。之后,只需将它们用作正常的 aar 依赖项即可。
【讨论】:
问题不在于创建库项目,而是依赖于其他 AAR 库的库项目在使用 mavenDeployer (uploadArchives) 部署时不保留试试 gradle-fury。它解决了所有这些……嗯……东西。特别是 gradle 生成的无效和/或不准确的 pom。确认发布到 sonatype oss/maven central 的工作解决方案。没有手动 pom 编辑、pgp 签名支持等等。
网站:https://github.com/gradle-fury/gradle-fury
具体来说,您需要为您完成所有工作的 maven-support gradle 脚本。通常在 pom 中的所有东西都存储在 gradle.properties 中。也支持 android 变体、war 文件(很快会修复 distZip)、javadocs 和源 jar 等等。
免责声明,我正在努力
编辑:另一条信息。尽管 fury 确实为 AAR 库注入了依赖项和正确的类型,但 gradle-android 插件(谷歌制作的东西)不尊重依赖项部分并忽略它。基本上不支持 AAR 项目的传递依赖。不知道为什么
【讨论】:
以上是关于Android库项目瞬态依赖松散AAR类型的主要内容,如果未能解决你的问题,请参考以下文章
如何发布带有远程依赖项 (gradle) 的 Android 库 (aar)?
Android Gradle 插件Gradle 依赖管理 ⑨ ( implementation project 导入依赖库 Module | 导入aar文件作为依赖 | 先配置仓库再导入依赖 )