在 Quarkus 本机中的 JAX-RS 应用 运行 中使用 Jedis 池导致 ClassNotFoundException:org.apache.commons.pool2.impl.DefaultEvictionPolicy
Using Jedis pool in JAX-RS app running in Quarkus native results in ClassNotFoundException: org.apache.commons.pool2.impl.DefaultEvictionPolicy
我正在尝试在 Quarkus 本机模式下的应用程序 运行 中使用 JedisPool
(在 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)
作为临时解决方案,我改用创建直接连接而不是使用池,但仍在寻找使用池的可能性。
有什么建议或解决方法吗?
好的,我进一步挖掘并在这些页面上找到了关于 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
然后我的应用程序运行成功。
我正在尝试在 Quarkus 本机模式下的应用程序 运行 中使用 JedisPool
(在 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)
作为临时解决方案,我改用创建直接连接而不是使用池,但仍在寻找使用池的可能性。
有什么建议或解决方法吗?
好的,我进一步挖掘并在这些页面上找到了关于 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
然后我的应用程序运行成功。