在我的Android应用程序中,当引用依赖.jar中的代码的代码执行时,我得到一个java.lang.NoClassDefFoundError
。我的项目包括一个Android模块和一个纯java库模块,jar依赖项就在这个模块中。我使用gradle 1.10来构建这个项目。这是我的项目布局:
myProject
- app (Android)
- src
- build.gradle
- lib (java)
- src
- libs
- local-dependency.jar
- build.gradle
- build.gradle
- settings.gradle
主工程build.gradle
为空白,主工程settings.gradle
为:
include ':app', ':lib'
Android应用程序build.gradle
看起来像:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.8.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 18
buildToolsVersion "19.0.2"
defaultConfig {
minSdkVersion 18
targetSdkVersion 18
versionCode 1
versionName "1.0"
}
}
dependencies {
compile project(':lib')
}
库build.gradle
是:
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile <some-dependency-in-maven>
compile files('libs/local-dependency.jar')
}
所有编译和打包都没有错误,我在IDE (IntelliJ 13)中没有看到任何错误。由于某种原因,我的local-dependency.jar
在Android编译期间没有被添加到索引过程中。lib
项目中指定的任何maven依赖项都可以添加到Android .apk中;它只是我的本地jar依赖项。我是不是漏掉了什么?
谢谢!
这是不可能的,因为本地jar文件在Gradle中没有被声明为传递依赖。
你有两个选择:
- 合并java库中的两个jar,以便输出包含本地jar。
- 创建一个不同的项目,没有源代码,只有jar,并使项目依赖它。
第二个选项使您能够让多个项目直接依赖于本地jar(在此基础上成为传递依赖项)。为此,创建一个新的gradle项目,并在其build.gradle
中放入以下内容:
configurations.create("default")
artifacts.add("default", file('somelib.jar'))
这只是将您的jar注册为项目发布的默认工件,并且它将被其他项目使用。
在最近的gradle (4+, IIRC)版本中,你可以通过以下配置来实现:
compile (project(':ProjectIDependOn')) {
transitive = true
}
当依赖于另一个项目时,将transitive
设置为true将向该项目公开该项目的所有库。