如何将 JAR 依赖项包含到 AAR 库中
Posted
技术标签:
【中文标题】如何将 JAR 依赖项包含到 AAR 库中【英文标题】:How to include JAR dependency into an AAR library 【发布时间】:2016-01-31 10:14:45 【问题描述】:总结:
我有一个依赖于 JAR 文件的 AAR 文件,当我构建 AAR 项目时,它不包含 JAR 代码。
详情:
我有一个 Java SDK 库项目,其中包含我们用于 Java Web 项目等的代码,该库是使用 Gradle
创建的,并驻留在内部的 nexus 服务器中(作为 JAR)。
目标是通过多个 android 应用程序可以使用的 AAR 库提供此 JAR 库的“Android 配置”版本,并最大限度地减少实现它的工作量(和样板代码)。此 AAR 文件也会上传到 nexus 服务器以供 Android 应用程序项目使用。
我的 AAR 项目包含我的 Java SDK 库(JAR)的 gradle 依赖项,但在构建时,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 文件,请注意,我从中删除了 Maven 存储库声明到我的 nexus 服务器。为了这个问题,我想这应该无关紧要。
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')
注意:我最初通过在 AAR 项目的 lib 目录中添加 JAR 解决了这个问题,但这是不希望的。它使得拥有一个 Nexus 服务器毫无用处。最好我们可以在 AAR 项目的 gradle 文件中增加 JAR 的版本号,然后在编译时自动更新。
NOTE2: 我尝试将transitive=true
添加到我在 Android 项目中的 AAR 依赖项中,但没有解决任何问题,真正的问题是在构建 AAR 项目时,JAR 项目代码没有不要捆绑。
【问题讨论】:
【参考方案1】:你可以添加这个任务:
task copyLibs(type: Copy)
from configurations.compile
into 'libs'
将从您的 Nexus 下载依赖项,但是当您需要打包库时,请先执行此任务,jar
文件将被复制并包含在最终的 aar
中。
【讨论】:
伙计,我想这就是我一直在寻找的东西,我会尝试并回来。谢谢! 是的,这解决了问题。我刚刚添加了一个clean task
首先清除libs 目录,基于this post。在此之后,我不得不在packagingOptions
中为META-INF
中的一些生成文件添加一些排除项,但总的来说,这有效!
@bigdestroyer:知道我可以用 aar 依赖做同样的事情吗?这是我的问题:***.com/questions/41847266/…
嗨@rastadrian,我有同样的问题,你能分享你的代码吗?关于创建清洁任务?
我应该在我的项目中的哪里添加这个任务?我也有同样的场景【参考方案2】:
默认情况下,AAR 不包含任何依赖项。 @Hector 提到的解决方案应该适用于 gradle plugin here 中提到的自定义配置。
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"
【讨论】:
欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. 我从另一个模块复制 jar lib 并通过添加preBuild.dependsOn copyLibs
jar 将被复制每个构建(以防模块被修改)
在android...
中添加afterEvaluate assembleDebug.finalizedBy(copyLibs)
。这会工作【参考方案3】:
对于 Gradle 4.6,这些建议都没有帮助我,所以我浪费了一整天的时间来发明自己的。
最终我找到了一个很好的 Gist 并为我的 Gradle 版本修改了它: https://gist.github.com/stepio/824ef073447eb8d8d654f22d73f9f30b
【讨论】:
这是唯一对我有用的解决方案。非常感谢分享这个! 这只是将 jar 文件复制到“./build/intermediates/packaged-classes/debug/libs”路径。但是如何将依赖库与我们新创建的库合并呢? 您错过了下一次调用:“mergeReleaseJniLibFolders.dependsOn copyDeps”和“mergeDebugJniLibFolders.dependsOn copyDebugDeps” 我写了这段代码,但是如何用合并的 jar 构建 aar 文件? 仅构建 .aar 文件时,这是否适用于 assemble 任务?【参考方案4】:在带有 Gradle 的 android tools 3.6.2 中,上面的那些对我不起作用。 5.6.1 .对于任何有同样问题的人,最后使用https://github.com/kezong/fat-aar-android 对我来说效果很好。
【讨论】:
【参考方案5】:我今天遇到了同样的问题,上面没有解决方案可以帮助我,但是经过一番斗争我可以解决它..
更新项目 build.gradle 文件中的 gradle 版本 classpath "com.android.tools.build:gradle:7.0.3"
和
或
禁用应用程序收缩和多 dex debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
【讨论】:
以上是关于如何将 JAR 依赖项包含到 AAR 库中的主要内容,如果未能解决你的问题,请参考以下文章