我需要暴露一些Picasso资源来满足一个相当奇怪的请求。为此我需要将Picasso导入为库项目而不是编译的jar。我创建了一个新的Android项目,并将picasso \ picasso \ src \ main \ java(克隆主文件)的内容复制到src文件夹中。 Picasso使用OkHttp,所以我下载了最新版本的jar(2.3.0)并将其放在Picasso项目的libs文件夹中;将它添加到构建路径;在构建路径中选择了jar" Order and Export"喜好。最后,我将Picasso项目作为一个库并将其包含在主项目中(也从libs中删除了旧的Picasso jar)。
应用程序第一次尝试发出Picasso请求时,我得到以下异常:
04-12 17:04:15.956: E/AndroidRuntime(5436): java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.DiskLruCache$4
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.okhttp.internal.DiskLruCache.<clinit>(DiskLruCache.java:810)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.okhttp.Cache.<init>(Cache.java:168)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:77)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:55)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:45)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Utils$OkHttpLoaderCreator.create(Utils.java:424)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Utils.createDefaultDownloader(Utils.java:250)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Picasso$Builder.build(Picasso.java:832)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Picasso.with(Picasso.java:662)
指定的类似乎在jar中,但DiskLruCache.java似乎分成了总共9个类文件:
$ ls DiskLruCache*
DiskLruCache$1.class DiskLruCache$4.class DiskLruCache$Entry.class
DiskLruCache$2.class DiskLruCache$Editor$1.class DiskLruCache$Snapshot.class
DiskLruCache$3.class DiskLruCache$Editor.class DiskLruCache.class
我已准备好提供其他信息。任何建议都将受到高度赞赏。
修改
问题似乎出现在OkHttp jar中。我已经尝试将它与Picasso jar一起导入主项目(最新版本 - 2.5.2),我得到了同样的例外。我没有看到任何OkHttp警告,表明一些其他线程中所述的不兼容性。
答案 0 :(得分:7)
OkHttp需要Okio才能运作。这在GitHub page上提到,位于下载按钮下方。导入Okio jar修复了NoClassDefFoundError。这是我刚刚测试的工作配置: picasso:2.5.2; okhttp:2.3.0; okio:1.3.0