Apache Commons Pool是一个开源的实现资源池的中间件。我们的项目中用到了它(Commons Pool 2),最近开始在android下测试时发现会抛出ClassNotFoundException
异常,就是找不到java.lang.management.ManagementFactory
类。
根本的原因就是Commons Pool
用到了JMX,而android并不支持JMX。
github上这个错误报告有跟贴说明了原因《Jedis 2.3.x can’t use on Android》
这是2014年的报告 ,现在Commons Pool 2
已经解决了这个问题。
解决问题的办法也很简单,org.apache.commons.pool2.impl.BaseObjectPoolConfig
设计有一个jmxEnabled
成员用于调用方设置是否支持JMX,所以在创建GenericObjectPool
对象时,构造方法中GenericObjectPoolConfig
参数只要指定jmxEnabled
为false
就可以了。
示例代码如下:
// 静态常量
private static final boolean jmxEnable = isJmxEnable();
/**
* 判断JVM是否支持JMX,android下返回{@code false}
* @return
*/
private static boolean isJmxEnable(){
try{
Class.forName("java.lang.management.ManagementFactory");
return true;
}catch(ClassNotFoundException e){
return false;
}
}
void testSomething(GenericObjectPoolConfig poolConfig){
...
poolConfig.setJmxEnabled(jmxEnable);
GenericObjectPool<T> internalPool = new GenericObjectPool<T>(factory, poolConfig);
...
}