Android 库项目瞬态依赖松散 AAR 类型

Android library project transient dependencies loose AAR type

提问人:rharter 提问时间:9/25/2014 更新时间:10/22/2016 访问量:839

问:

我正在做一个项目,其中包括两个 Android 库项目。当我将这些库上传到我的 Maven 存储库 (Nexus) 时,生成的 pom 不包含依赖项中的元素。<type>aar</type>

这是我的依赖关系树

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

在这张图中你可以看到,my 依赖于 ,它依赖于 。这两个库都是 Android 库项目,因此是 AAR。applib1lib2

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

请注意如何包含作为依赖项。Lib1Lib2project()

现在,当我使用 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 的依赖项列表中生成的,因此 maven 默认寻找 jar。<type>aar</type>

有谁知道如何构建包含 Gradle 瞬态依赖项的 Android 库项目?

Android Maven android-gradle-plugin android-build

评论


答:

0赞 Fco P. 1/15/2015 #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 依赖项即可。

评论

0赞 rharter 1/16/2015
问题不在于创建库项目,而在于使用 mavenDeployer (uploadArchives) 部署时,依赖于其他 AAR 库的库项目不会保留 pom 中依赖元素的 <type>aar</type>部分,因此 maven 尝试将这些瞬态依赖项解析为 jar(默认)。
0赞 Fco P. 1/16/2015
我明白了。但是假设 pom 中的其他一切都没问题,只需添加缺少的类型并手动运行 maven 就会生成 aars。
0赞 rharter 1/16/2015
当然,但是在这一点上,我正在手动构建我的依赖项,这否定了我使用 maven 的自动依赖项管理优势。我需要能够分发依赖于其他库的库,而无需注意每个用户都需要手动下载依赖项、修改 pom 并在本地构建它们。
0赞 spy 10/13/2016 #2

试试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 项目的可传递依赖项。不知道为什么