当我的服务尝试使用Keyclove管理客户端连接到Keyclove服务器时,我遇到了专门针对类org.jboss.resteasy.client.jaxrs.internal.proxy.ProxyBuilderImpl
的java.lang.ClassNotFoundException
。
以下是该问题的具体内容:
- 在Azure Kubernetes服务(AKS)群集中运行的用户接受度测试(UAT)环境中发生错误。
- 该服务是Dockerized的,Docker映像是在测试环境中构建和部署的,该环境在与UAT环境不同的AKS集群上运行。
- 然后从测试环境中复制Docker映像,并在UAT环境中部署。
- 重要的是,
ClassNotFoundException
不会在测试环境中出现。
我已检查了以下几个方面:
- 依赖项:所需的依赖项,包括Resteasy库,都包含在Docker映像中。
- 环境变量:我已经验证了在UAT环境中正确设置了所有必要的环境变量。
- 配置:测试环境和UAT环境之间的配置没有明显的差异。
- 类路径:Docker映像中的类路径似乎配置正确。
我已经查看了错误日志,但它们主要指出了ClassNotFoundException
,而没有提供对根本原因的其他见解。
任何解决此问题的指导或见解将不胜感激。如果你需要更多的细节或日志,请让我知道。谢谢!
下面是错误日志
java.lang.RuntimeException: Exception while adding Patients to batch
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.CxxxxxxxxServiceImpl.savePatients(CxxxxxxxxServiceImpl.java:235)
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.ExxxxServiceImpl.saveEvents(ExxxxServiceImpl.java:120)
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.ExxxxServiceImpl.segregateEventsByEntitiesAndSave(ExxxxServiceImpl.java:184)
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.ExxxxServiceImpl.lambda$saveEventsAsEntities$0(ExxxxServiceImpl.java:97)
at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804)
at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.internal.proxy.ProxyBuilderImpl
at org.jboss.resteasy.client.jaxrs.ProxyBuilder.builder(ProxyBuilder.java:41)
at org.jboss.resteasy.client.jaxrs.internal.ClientWebTarget.createProxyBuilder(ClientWebTarget.java:107)
at org.jboss.resteasy.client.jaxrs.internal.ClientWebTarget.proxy(ClientWebTarget.java:94)
at org.keycloak.admin.client.spi.ResteasyClientClassicProvider.targetProxy(ResteasyClientClassicProvider.java:48)
at org.keycloak.admin.client.token.TokenManager.<init>(TokenManager.java:61)
at org.keycloak.admin.client.Keycloak.<init>(Keycloak.java:91)
at org.keycloak.admin.client.KeycloakBuilder.build(KeycloakBuilder.java:152)
at com.xxx.workxxxxxxxxxxxxxxxx.config.KeycloakConfig.getInstance(KeycloakConfig.java:37)
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.KxxxxxxxServiceImpl.getInstance(KxxxxxxxServiceImpl.java:240)
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.KxxxxxxxServiceImpl.getRealmResource(KxxxxxxxServiceImpl.java:226)
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.KxxxxxxxServiceImpl.importUsers(KxxxxxxxServiceImpl.java:132)
at com.xxx.workxxxxxxxxxxxxxxxx.service.impl.CxxxxxxxxServiceImpl.savePatients(CxxxxxxxxServiceImpl.java:227)
... 10 more
Caused by: java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.internal.proxy.ProxyBuilderImpl
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at org.jboss.resteasy.client.jaxrs.ProxyBuilder.builder(ProxyBuilder.java:35)
... 21 more
字符串
我试图通过拉出映像、在其中运行并执行以下命令来检查Docker容器是否包含类,从而在本地系统中重现错误
docker exec -it <docker_id> /bin/bash
jar -tf /root/.m2/repository/org/jboss/resteasy/resteasy-client/4.7.9.Final/resteasy-client-4.7.9.Final.jar | grep ProxyBuilderImpl.class
型
它提供了以下内容:
1条答案
按热度按时间gudnpqoy1#
我今天遇到了同样的问题。我使用keycloak-admin-client来配置多个realm,我是通过Stream API来完成的,特别是顺序流Collection.stream()。我使用嵌入式tomcat的spring-boot。
我开始通过Collection.parallelStream()测试并行流的使用,对于某些项,我得到的堆栈跟踪基本上与您的相同,原因是:Caused by:java.lang.ClassNotFoundException:org.jboss.resteasy.client.jaxrs.internal.proxy.ProxyBuilderImpl
我注意到失败的项目的一个模式,那就是底层线程是基于ForkJoinPool.在我看来,这些线程的类路径不包括某些类.我不会推测为什么是这样.有人更有资格可能提供信息.
我通过设置java.util.concurrent.ExecutorService(java.util.concurrent.Executors.newFixedThreadPool(int))来“修复”我的问题。然后我循环遍历我的领域集合,并通过ExecutorService.invokeAll提交我的任务(我需要阻塞,直到所有任务都完成)。在这样做之后,我无法重现该问题。
至于为什么您会根据运行代码的环境获得不同的结果,是否是由于集合中的项目数量不同?参考“将患者添加到批次时出现异常”