我正在尝试使用带有依赖项的gradle从Android库项目(非可执行文件)构建.Jar文件,但我得到NoClassDefFoundError,因为它正在从依赖模块中访问其中一个文件。
到目前为止,我已经尝试过FatJar方法,但它包含Jar文件中除Dependent库之外的所有内容。
我该怎么办?
更新
我的Gradle.build文件
apply plugin: 'android'
android {
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.myapplication"
minSdkVersion 9
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
resources {
srcDir 'src/../lib'
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.google.code.gson:gson:2.2.4'
}
task deleteOldJar(type: Delete) {
delete 'build/libs/AndroidPlugin.jar'
}
task exportJar(type: org.gradle.api.tasks.bundling.Jar) {
//from('build/intermediates/bundles/release/')
//from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
// archiveName = "yourjar.jar"
from {
configurations.runtime.collect {
it.isDirectory() ? it : zipTree(it)
}
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
}
into('release/')
include('classes.jar')
///Give whatever name you want to give
rename('classes.jar', 'AndroidPlugin.jar')
}
exportJar.dependsOn(deleteOldJar, build)
答案 0 :(得分:3)
有一个很好的插件可以轻松生成Fat Jars:https://github.com/musketyr/gradle-fatjar-plugin。但它适用于java
插件,它与com.android.library
btw。
所以,我找到了一些解决方法。每个Jar文件实际上都是一个Zip存档。 这意味着我们可以将其解压缩并将其内容添加到新存档中。
有一段代码生成Fat Jar并将其推送到已定义的代码 本地/远程Maven存储库:
...
apply plugin: 'maven-publisher'
publishing {
publications {
maven(MavenPublication) {
artifact bundleRelease
}
mavenJava(MavenPublication) {
artifact fatJar
}
}
}
task fatJar(type: Jar) {
from (zipTree('libs/library-one.jar'))
from (zipTree('libs/library-two.jar'))
from (zipTree('libs/library-three.jar'))
from ('build/intermediates/classes/release/') {
exclude '**/BuildConfig.class'
exclude '**/R$*.class'
exclude '**/R.class'
}
}
...
比你只需要运行:
$ ./gradlew clean build publishToMavenLocal
P.S。如果您不想单独编写每个lib,也可以遍历libs
(包括*.jar
)文件夹。
答案 1 :(得分:0)
在您的项目中,在APP中创建名为' libs'的文件夹。 ,并复制playservices的jar。这适用于Android Studio。
APP
-libs
-src
-build
在你的构建中:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile fileTree(dir: 'libs', include: ['*.so'])
compile files('libs/NameOfJar.jar')
}