首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在安卓系统上使用cache2k时的java.lang.NoClassDefFoundError

在安卓系统上使用cache2k时的java.lang.NoClassDefFoundError
EN

Stack Overflow用户
提问于 2018-12-03 03:23:04
回答 1查看 557关注 0票数 1

cache2k看起来很棒,我真的很想在我的应用程序中使用它来缓存对象,我得到了一个java.lang.NoClassDefFoundError

请看下面我的堆栈跟踪:

代码语言:javascript
复制
12-02 19:09:43.421 25543-25543/uk.whitecrescent.waqti E/AndroidRuntime: FATAL EXCEPTION: main
Process: uk.whitecrescent.waqti, PID: 25543
java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/InitialContext;
    at org.cache2k.impl.serverSide.JndiDefaultNameProvider.registerCache2kExtension(JndiDefaultNameProvider.java:37)
    at org.cache2k.core.Cache2kCoreProviderImpl.registerExtensions(Cache2kCoreProviderImpl.java:79)
    at org.cache2k.core.Cache2kCoreProviderImpl.<init>(Cache2kCoreProviderImpl.java:57)
    at java.lang.Class.newInstance(Native Method)
    at org.cache2k.spi.SingleProviderResolver.resolve(SingleProviderResolver.java:110)
    at org.cache2k.spi.SingleProviderResolver.resolve(SingleProviderResolver.java:82)
    at org.cache2k.spi.SingleProviderResolver.resolveMandatory(SingleProviderResolver.java:64)
    at org.cache2k.CacheManager.<clinit>(CacheManager.java:54)
    at org.cache2k.CacheManager.getInstance(CacheManager.java:88)
    at org.cache2k.Cache2kBuilder.config(Cache2kBuilder.java:160)
    at org.cache2k.Cache2kBuilder.enableJmx(Cache2kBuilder.java:758)
    at uk.whitecrescent.waqti.model.persistence.Caches.<clinit>(Caches.kt:74)
...
...
Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.InitialContext" on path: DexPathList

我知道原因是因为cache2k想使用安卓之外的javax.naming,实际上它需要在这个类中。

代码语言:javascript
复制
import org.cache2k.CacheManager;
import org.cache2k.spi.Cache2kExtensionProvider;

import javax.naming.Context;
import javax.naming.InitialContext;

/**
 * @author Jens Wilke; created: 2014-10-10
 */
public class JndiDefaultNameProvider implements Cache2kExtensionProvider {

  @Override
  public void registerCache2kExtension() {
    try {
      Context ctx = new InitialContext();
      ctx = (Context) ctx.lookup("java:comp/env");
      String _name =
        (String) ctx.lookup("org.cache2k.CacheManager.defaultName");
      if (_name != null) {
        CacheManager.setDefaultName(_name);
      }
    } catch (Exception ignore) {
    }
  }

}

build.gradle看起来像这样

代码语言:javascript
复制
ext.cache2kVersion = '1.2.0.Final'
implementation "org.cache2k:cache2k-api:$cache2kVersion"
implementation "org.cache2k:cache2k-base-bom:$cache2kVersion"
implementation "org.cache2k:cache2k-core:$cache2kVersion"

我试着让最下面的一个是不起作用的runtimeOnly。我甚至尝试过下载javax.naming jar,结果却依赖于更多的东西。

我确信这只是我的一个愚蠢的错误,但我似乎找不到它!

EN

回答 1

Stack Overflow用户

发布于 2019-02-13 15:33:47

很抱歉这么久才回复,让你失望了。

cache2k jar非常小,因此我决定放弃制作更多更小的jar。这意味着JMX支持包含在jar中。文档记录在这里:https://github.com/cache2k/cache2k/issues/80

为了让它再次在Android上工作,我提供了proguard规则,去掉了对JMX的支持。在这里的文档中可以看到:https://cache2k.org/docs/latest/user-guide.html#android

让我知道这是否对你有帮助,如果有任何进一步的问题,请大声说出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53583759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档