2015-10-06 41 views
4

我有Android gradle项目,它由主模块和纯java库组成。 Java库有一个jar文件的依赖(GSON在这里显示仅用于演示目的):Android java模块“jar”文件依赖问题

tree structure

该项目编译正常,但当我尝试运行它,它失败NoClassDefFoundError

java.lang.NoClassDefFoundError: com.google.gson.Gson 
    at com.example.JavaLibClass.javaMethod(JavaLibClass.java:7) 
    at com.denisk.deptest.MainActivity.onCreate(MainActivity.java:15) 
    at android.app.Activity.performCreate(Activity.java:5135) 

如果我用常规的Maven依赖关系替换jar依赖项,它将起作用。

如果我摆脱javalibappjar依赖,并介绍在活动依赖Gson依赖,它的工作原理。

应用程序/的build.gradle依赖性:

dependencies { 
    compile project(':javalib') 
} 

javalib /的build.gradle

apply plugin: 'java' 

dependencies { 
    compile files('libs/gson-2.2.4.jar') 
} 

MainActivityonCreate(内侧app):

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    JavaLibClass javaLibClass = new JavaLibClass(); 
    javaLibClass.javaMethod(); 

} 

JavaLibClass(内javalib):

public class JavaLibClass { 
    public void javaMethod() { 
     Gson gson = new Gson(); 
    } 
} 

Github上库与演示项目:

https://github.com/denisk20/android-gradle-dependency-test

我是不是做错了什么或者是一个错误吗?


编辑1: 不要紧,我是否建立与Android Studio或纯摇篮。

编辑2: 我已经尝试过使用AOSP的android gradle插件1.4.0-beta4 - 同样的错误。

+0

它已经有一段时间了,因为我不得不使用jar而是IIRC,所以你需要将它列在你的依赖的'compile files('libs/gson-2.2.4。罐')',我可能是错误的,虽然 – tyczj

+0

@tyczj比的建议,但它不会改变任何东西。 –

+0

Android问题跟踪器中的类似问题: https://code.google.com/p/android/issues/detail?id=186012 –

回答

0

好吧,它其实不是一个错误,而是需要将jar文件作为依赖项导入到项目中。我相信你只是把这个Jar文件放到你项目的lib文件夹中,但是没有在你的项目中作为依赖项导入。这就是为什么Maven依赖项工作正常,因为它会自动导入它。所以,转到文件>项目结构,在模块部分下选择您的项目,然后在依赖项选项卡上,通过浏览到lib文件夹将您的jar文件添加为文件依赖项。现在,重建你的项目,它应该工作得很好。

+0

一旦我改变'compile fileTree(dir:'libs',include:['* .jar'])''编译文件('libs/gson-2.2.4。罐')' http://snag.gy/OR12Y.jpg。我已经在依赖关系中显式编辑了问题和列出的jar文件,以避免混淆。 –

1

未能加载的类可能缺少它自己的依赖项。令人烦恼的是,Android 5.1中的虚拟机并没有告诉你这种依赖是什么。 我发现,当我用Dalvik虚拟机在旧版Android 2.3设备上运行我的应用程序时,在日志消息中确定了缺失的依赖关系。