首页 > 解决方案 > 在 Quarkus 本机中运行的 JAX-RS 应用程序中使用 Jedis 池会导致 ClassNotFoundException:org.apache.commons.pool2.impl.DefaultEvictionPolicy

问题描述

我正在尝试JedisPool在 Quarkus 本机模式下运行的应用程序中使用(在 JVM 模式下工作正常)。
我已经禁用了池的 JMX 功能,该功能在本机模式下不可用,如下所示:

  JedisPoolConfig jedisConfiguration = new JedisPoolConfig();
  jedisConfiguration.setJmxEnabled(false);
  jedisPool = new JedisPool(jedisConfiguration, jedisURI);

但是我遇到以下错误:

2020-04-29 17:35:37,724 INFO  [test.StockQuote] (main) java.lang.IllegalArgumentException: Unable to create org.apache.commons.pool2.impl.EvictionPolicy instance of type org.apache.commons.pool2.impl.DefaultEvictionPolicy
    at org.apache.commons.pool2.impl.BaseGenericObjectPool.setEvictionPolicyClassName(BaseGenericObjectPool.java:662)
    at org.apache.commons.pool2.impl.BaseGenericObjectPool.setEvictionPolicyClassName(BaseGenericObjectPool.java:687)
    at org.apache.commons.pool2.impl.BaseGenericObjectPool.setConfig(BaseGenericObjectPool.java:235)
    at org.apache.commons.pool2.impl.GenericObjectPool.setConfig(GenericObjectPool.java:302)
    at org.apache.commons.pool2.impl.GenericObjectPool.<init>(GenericObjectPool.java:115)
    at redis.clients.jedis.util.Pool.initPool(Pool.java:45)
    ...
 Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.DefaultEvictionPolicy
    at com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:60)
    at java.lang.Class.forName(DynamicHub.java:1197)

作为临时解决方案,我切换到创建直接连接而不是使用池,但仍在寻找使用池的可能性。

有什么建议或解决方法吗?

标签: jax-rsjedisquarkus

解决方案


Class.forName好的,我挖掘了更多,并在这些页面上找到了更多信息: Reflection on Substrate VM and Quarkus - Tips for writing native applications 并通过包含以下文件的文件找到了解决方案reflection-config.json

[
  {
    "name" : "org.apache.commons.pool2.impl.DefaultEvictionPolicy",
    "allDeclaredConstructors" : true,
    "allPublicConstructors" : true,
    "allDeclaredMethods" : true,
    "allPublicMethods" : true,
    "allDeclaredFields" : true,
    "allPublicFields" : true
  }
]

您还需要在application.properties文件中添加以下行:

quarkus.native.additional-build-args =-H:ReflectionConfigurationFiles=reflection-config.json

然后我的应用程序成功运行。


推荐阅读