在Android上使用cache2k时java.lang.NoClassDefFoundError

时间:2018-12-02 19:23:04

标签: java android cache2k

df看起来很棒,我真的想在我的应用程序中使用它来缓存对象,我得到了cache2k

在下面查看我的堆栈跟踪:

java.lang.NoClassDefFoundError

我知道原因是因为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,而这不是Android中使用的,实际上它是在此类中所需要的。

javax.naming

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

我试图让最底端的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 jar,只是想让它依赖更多内容。

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

1 个答案:

答案 0 :(得分:1)

很抱歉,很长一段时间内您都无法回应。

cache2k罐子很小,因此我决定放弃以制造更多的小罐子。这意味着jar中包含了JMX支持。在此处记录:https://github.com/cache2k/cache2k/issues/80

为了使其再次在Android上运行,我提供了proguard规则,该规则排除了JMX支持。在此处的文档中查看: https://cache2k.org/docs/latest/user-guide.html#android

让我知道是否对您有帮助,请问是否还有其他问题。