AKS容器出现ClassNotFoundException:ProxyBuilderImpl(UAT异常,测试环境正常)
Keycloak客户端连接时出现ClassNotFoundException:找不到ProxyBuilderImpl类
问题详情
- 异常出现在Azure Kubernetes Service(AKS)集群的UAT环境,测试环境(另一AKS集群)无此问题
- 服务已容器化,镜像在测试环境构建后复制到UAT部署
- 具体异常:
java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.internal.proxy.ProxyBuilderImpl
已完成排查
- 依赖:Docker镜像已包含Resteasy相关依赖,本地拉取镜像验证时,容器内的
resteasy-client-4.7.9.Final.jar中确实存在目标类 - 环境变量:UAT环境必要配置项正确
- 配置文件:测试与UAT环境无明显差异
- 类路径:Docker镜像的类路径配置无误
错误日志
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 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
输出结果:org/jboss/resteasy/client/jaxrs/internal/proxy/ProxyBuilderImpl.class
解决思路
1. 类加载器冲突排查
- 检查UAT环境中服务运行时是否存在多个版本的Resteasy依赖:在UAT容器内执行
find / -name "resteasy-*.jar",查看是否有重复或版本不一致的包,尤其是resteasy-client和resteasy-core这类核心包 - 验证类加载顺序:在JVM启动参数中添加
-verbose:class,查看ProxyBuilderImpl类的加载来源,确认是否从正确的jar包中加载
2. 镜像复制过程完整性校验
- 重新推送镜像到UAT仓库,或直接在UAT环境重新构建镜像,排除镜像传输过程中的文件丢失问题
- 对比测试环境和UAT环境中容器内的依赖目录:执行
diff命令对比两个环境中/root/.m2/repository/org/jboss/resteasy目录下的文件结构和文件哈希值,确认依赖完全一致
3. Kubernetes环境差异排查
- 检查UAT环境AKS集群的镜像拉取策略:确认私有仓库的镜像拉取策略是否为
Always,避免拉取到旧的损坏镜像 - 查看Pod的挂载卷配置:确认是否有额外的卷挂载覆盖了容器内的依赖目录,导致运行时无法访问正确的jar包
4. 版本兼容性验证
- 确认Keycloak Admin Client版本与Resteasy版本是否匹配:比如Keycloak 18+可能需要更高版本的Resteasy,检查构建文件中的依赖版本对应关系
- 显式指定
resteasy-client和resteasy-proxy的版本,避免依赖管理工具自动引入不兼容的版本
内容的提问来源于stack exchange,提问作者Abi Showkath
相关产品推荐
相关产品推荐

