java - 在 Android 上使用 cache2k 时出现 java.lang.NoClassDefFoundError
问题描述
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
想要使用javax.naming
它不在Android中的原因,实际上它需要在这个类中。
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
那个不起作用。我什至尝试下载javax.naming
jar,只是让它依赖于更多的东西。
我确定这只是我的一个愚蠢的错误,但我似乎找不到它!
解决方案
很抱歉这么久没有回复,让您失望了。
cache2k jar 非常小,因此我决定放弃制作更多更小的 jar。这意味着 JMX 支持包含在 jar 中。这记录在这里:https ://github.com/cache2k/cache2k/issues/80
为了让它再次在 Android 上运行,我提供了去除 JMX 支持的 proguard 规则。在此处的文档中查看: https ://cache2k.org/docs/latest/user-guide.html#android
让我知道这是否对您有帮助,如果有任何进一步的问题,请大声喊叫。
推荐阅读
- python - 如果全局设置,如何加载共享库要求冲突的两个不同 Python 模块
- html - 在表 II 中抓取特定数据
- typescript - 在 Parcel 2 中从 Javascript 导入非代码资产 (.png) 显示 ts 错误
- konvajs - 是否可以按周期隐藏转换框?
- javascript - 使用 AJAX 或 Javascript 将值从 DIV 解析到另一个 DIV
- javascript - 将 jQuery getJSON 插入 for 循环
- javascript - JavaScript,在“鼠标悬停”上,当您尝试将鼠标移到块上时会出现并消失
- regex - 使用正则表达式从原始数据中提取文件名
- php - Laravel:PHP特征可以将值添加到模型的受保护值
- android - 在移动设备上而不是在桌面设备上重定向循环