jax-rs - 在 Quarkus native 中运行的 JAX-RS 应用程序中使用 Jedis 池会导致 ClassNotFoundException : org. apache.commons.pool2.impl.DefaultEvictionPolicy

标签 jax-rs jedis quarkus

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

  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 VMQuarkus - 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

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

关于jax-rs - 在 Quarkus native 中运行的 JAX-RS 应用程序中使用 Jedis 池会导致 ClassNotFoundException : org. apache.commons.pool2.impl.DefaultEvictionPolicy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61797951/

相关文章:

java - 实例化 EntityManager 的最佳实践

java - 带有非可选参数的基于 Quarkus 注释的拦截器

Java 8 LocalDate jackson 格式

java - 我如何实际使用配置了 Spring 的 JAX-RS 客户端?

java - Jersey 类路径扫描示例 jersey.config.server.provider.classpath

私有(private)方法上的 Javax 验证不会被触发

java - 在 Quarkus 中使用 @Inject 和接口(interface)进行依赖注入(inject)

concurrency - Redis 出队时处于 'parking to wait' 状态的线程

java - 绝地武士 | Redis BitMap 获取所有启用位

java - 如何将 Redis 数据库值写入 excel 表?