如何将JAR依赖项包含到AAR库中

38

概述:

我有一个AAR文件依赖于一个JAR文件,但当我编译AAR项目时,它不包含JAR代码。

详细内容:

我有一个Java SDK库项目,其中包含我们用于Java Web项目等的代码,此库使用Gradle创建,并位于内部nexus服务器上(作为JAR)。

目标是通过AAR库提供“Android配置”版本的JAR库,以便多个Android应用程序可以使用并尽量减少实现它所需的工作量(和样板代码)。这个AAR文件也会上传到nexus服务器,供Android应用项目使用。

我的AAR项目包括一个gradle依赖项来引用Java SDK库(即JAR),但构建后,AAR不包含任何来自它的类。

代码:

这是Java SDK项目的gradle文件:

apply plugin: 'java'

//noinspection GroovyUnusedAssignment
sourceCompatibility = 1.7
version = '1.1.1'

repositories {
    mavenCentral()
}

jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile 'org.apache.directory.studio:org.apache.commons.io:2.4'
    compile 'org.springframework:spring-web:3.1.1.RELEASE'
    compile 'com.google.code.gson:gson:2.3'
}

这是我的AAR项目的Gradle文件,注意我从中删除了指向我的Nexus服务器的Maven仓库声明。我想这对于这个问题来说不应该有影响。

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "2.2.2"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.0'

    compile ('com.mycompany:javasdk:1.1.1')
}

这是我的Android项目的Gradle文件,我再次删除了Nexus服务器的引用:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.mycompany.application1"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.0'

    compile ('com.mycompany:androidsdk:2.2.2@aar')
}
注意: 我最初是通过将JAR添加到AAR项目的lib目录中来解决这个问题,但这样做不可取。它使得拥有nexus服务器没有意义。希望我们能够在AAR项目的gradle文件中仅仅增加JAR的版本号,然后在编译时自动更新。

注意2: 我尝试在Android项目中的AAR依赖项中添加transitive=true,但这并没有解决任何问题,真正的问题是在构建AAR项目时,JAR项目代码未被捆绑。

4个回答

53

你可以添加这个任务:

task copyLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

依赖项将从您的Nexus下载,但当您需要打包库时,请先执行此任务,jar文件将被复制并包含在最终的aar中。


是的,问题已经解决了。我只是首先添加了一个“清理任务”来清除libs目录,参考了这篇文章。之后,我不得不在packagingOptions中添加一些排除项,以排除META-INF中的一些生成文件,但总体而言,这个方法很有效! - rastadrian
1
嗨@rastadrian,我也遇到了同样的问题,你能分享一下你的代码吗?关于创建清理任务的问题? - Nguyễn Hoàng
你能解释一下完整的解决方案吗?你在哪里添加了这个任务? - faraz khonsari
1
在我的项目中应该把这个任务添加到哪里?我也遇到了同样的情况。 - Shailesh
好的,我之前是在项目 Gradle 中添加,但实际上应该在模块 Gradle 中添加。 - ocramot
显示剩余5条评论

12

默认情况下,AAR 不包含任何依赖项。@Hector 提到的解决方案适用于 Gradle 插件 < 3.0。对于 Gradle 插件 3.0+,请尝试按照此处所述进行自定义配置。

android { ... }

// Add a new configuration to hold your dependencies
configurations {
    myConfig
}

dependencies {
    ....
    myConfig 'com.android.support:appcompat-v7:26.1.0'
    myConfig 'com.android.support:support-v4:26.1.0'
    ...
}

task copyLibs(type: Copy) {
    from configurations.myConfig 
    into "libs"
}

2
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅提供链接的答案可能会被删除。 - Papershine
我从另一个模块复制jar库,并通过添加preBuild.dependsOn copyLibs,每次构建都会复制jar(以防该模块被修改)。 - Davide
1
android{...} 中添加 afterEvaluate {assembleDebug.finalizedBy(copyLibs)}。这将起作用。 - Alireza Saremi

6

1
这是唯一对我有效的解决方案。非常感谢分享! - waldgeist
这只是将jar文件复制到“./build/intermediates/packaged-classes/debug/libs”路径。但是如何将依赖库与我们新创建的库合并? - Nagaraj Alagusundaram
你错过了下一个调用: "mergeReleaseJniLibFolders.dependsOn copyDeps" 和 "mergeDebugJniLibFolders.dependsOn copyDebugDeps"。 - stepio
我写了这段代码,但如何使用合并的jar文件构建aar文件? - Nikunj Paradva
1
在只构建.aar文件时,这是否与汇编任务配合使用? - Nikunj Paradva
@stepio,这对我不起作用。你能否更新到2021年的版本? - nkhar

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接