如何将 JAR 依赖项包含到 AAR 库中
How to include JAR dependency into an AAR library
总结:
我有一个依赖于 JAR 文件的 AAR 文件,当我构建 AAR 项目时,它不包含 JAR 代码。
详情:
我有一个 Java SDK 库项目,其中包含我们用于 Java 网络项目等的代码,该库是使用 Gradle
创建的,驻留在内部 Nexus 服务器中(作为 JAR)。
目标是通过 AAR 库提供此 JAR 库的 "Android configured" 版本,供多个 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 文件,请注意,我从中删除了对我的 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')
}
注意: 我最初通过在 AAR 项目的 lib 目录中添加 JAR 来解决这个问题,但这是不希望的。它使拥有一个联系服务器变得毫无用处。我们可以在 AAR 项目的 gradle 文件中修改 JAR 的版本号,这样更新会在编译时自动发生。
注意 2: 我尝试在 Android 项目中将 transitive=true
添加到我的 AAR 依赖项中,但它没有解决任何问题,真正的问题是构建 AAR 项目时,JAR 项目代码未被捆绑。
您可以添加这个任务:
task copyLibs(type: Copy) {
from configurations.compile
into 'libs'
}
将从您的 Nexus 下载依赖项,但当您需要打包库时,请先执行此任务,然后 jar
文件将被复制并包含在最终 aar
.
中
默认情况下,AAR 不包含任何依赖项。 @Hector 提到的解决方案应该适用于 gradle 插件 < 3.0。对于 Gradle 插件 3.0+,尝试自定义配置 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"
}
None 的建议帮助了我 Gradle 4.6,所以我浪费了一整天的时间发明自己的建议。
最终我找到了一个很好的 Gist 并为我的 Gradle 版本修改了它:
https://gist.github.com/stepio/824ef073447eb8d8d654f22d73f9f30b
上面的那些在 android 工具 3.6.2 和 Gradle 中对我不起作用。 5.6.1 。对于遇到相同问题的任何人,最终使用 https://github.com/kezong/fat-aar-android 对我来说效果很好。
总结:
我有一个依赖于 JAR 文件的 AAR 文件,当我构建 AAR 项目时,它不包含 JAR 代码。
详情:
我有一个 Java SDK 库项目,其中包含我们用于 Java 网络项目等的代码,该库是使用 Gradle
创建的,驻留在内部 Nexus 服务器中(作为 JAR)。
目标是通过 AAR 库提供此 JAR 库的 "Android configured" 版本,供多个 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 文件,请注意,我从中删除了对我的 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')
}
注意: 我最初通过在 AAR 项目的 lib 目录中添加 JAR 来解决这个问题,但这是不希望的。它使拥有一个联系服务器变得毫无用处。我们可以在 AAR 项目的 gradle 文件中修改 JAR 的版本号,这样更新会在编译时自动发生。
注意 2: 我尝试在 Android 项目中将 transitive=true
添加到我的 AAR 依赖项中,但它没有解决任何问题,真正的问题是构建 AAR 项目时,JAR 项目代码未被捆绑。
您可以添加这个任务:
task copyLibs(type: Copy) {
from configurations.compile
into 'libs'
}
将从您的 Nexus 下载依赖项,但当您需要打包库时,请先执行此任务,然后 jar
文件将被复制并包含在最终 aar
.
默认情况下,AAR 不包含任何依赖项。 @Hector 提到的解决方案应该适用于 gradle 插件 < 3.0。对于 Gradle 插件 3.0+,尝试自定义配置 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"
}
None 的建议帮助了我 Gradle 4.6,所以我浪费了一整天的时间发明自己的建议。
最终我找到了一个很好的 Gist 并为我的 Gradle 版本修改了它: https://gist.github.com/stepio/824ef073447eb8d8d654f22d73f9f30b
上面的那些在 android 工具 3.6.2 和 Gradle 中对我不起作用。 5.6.1 。对于遇到相同问题的任何人,最终使用 https://github.com/kezong/fat-aar-android 对我来说效果很好。