在 sshj-0.35.0.jar 中间歇性出现 java.lang.NoClassDefFoundError: net/schmizz/sshj/common/DisconnectReason

问题描述 投票:0回答:1

我们有一个在容器内运行的网络服务,需要通过 ssh 会话在主机虚拟机上执行命令。 (宿主机vm是产品的主要运行环境)

我们使用 sshj-0.35.0 库与主机虚拟机进行 ssh 连接。执行命令后,当 ssh 连接断开时,我们收到错误消息。

此问题是间歇性的,仅在服务重新启动时才会出现。(在 10 次重新启动中有 3 次发现)

java.lang.NoClassDefFoundError: net/schmizz/sshj/common/DisconnectReason
        at net.schmizz.sshj.common.SSHException.toString(SSHException.java:92) ~[sshj-0.35.0.jar!/:?]
        at net.schmizz.sshj.AbstractService.notifyError(AbstractService.java:57) ~[sshj-0.35.0.jar!/:?]
        at net.schmizz.sshj.connection.ConnectionImpl.notifyError(ConnectionImpl.java:255) ~[sshj-0.35.0.jar!/:?]
        at net.schmizz.sshj.transport.TransportImpl.disconnect(TransportImpl.java:406) ~[sshj-0.35.0.jar!/:?]
        at net.schmizz.sshj.transport.TransportImpl.disconnect(TransportImpl.java:397) ~[sshj-0.35.0.jar!/:?]
        at net.schmizz.sshj.transport.TransportImpl.disconnect(TransportImpl.java:392) ~[sshj-0.35.0.jar!/:?]
        at net.schmizz.sshj.SSHClient.disconnect(SSHClient.java:439) ~[sshj-0.35.0.jar!/:?]
        at com.foo.bar.common.util.SSHUtil2.copyFromRemote(SSHUtil2.java:1079) ~[common-util-1.5.0.0.jar!/:?]
        at com.foo.bar.connectivity.base.service.PrivateDNSEditorService.deleteAllCustomDNSEntries(PrivateDNSEditorService.java:80) ~[connectivity-base-1.5.0.0.jar!/:?]
        at com.foo.bar.connectivity.onboarding.tasks.CleanupInternalDNSEntriesTask.execute(CleanupInternalDNSEntriesTask.java:42) ~[connectivity-orchestration-1.5.0.0.jar!/:?]
        at com.foo.bar.workflow.service.WorkflowTask.run(WorkflowTask.java:74) [foo-workflow-1.5.0.0.jar!/:?]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
        at java.base/java.lang.Thread.run(Thread.java:842) [?:?]
Caused by: java.lang.ClassNotFoundException: net.schmizz.sshj.common.DisconnectReason
        ... 14 more

SSHException.java 正在尝试访问 DisconnectReason 枚举。两者都位于 sshj jar 中的同一包中,这确认了依赖项 jar 在运行时存在于类路径中。唯一的问题是 jvm 无法找到/加载 DisconnectReason.java。

在出现此错误之前,我检查了日志中是否有任何 ExceptionInInitializerError,但找不到任何异常。

我将 sshj jar 升级到 0.38.0 版本,但这导致其他功能失败,所以我不得不恢复它。 (我没有机会对升级版本 0.38.0 进行测试,因为在我们工作流程的早期阶段就发现了失败)。

一个观察 - 当我使用 -verbose:class jvm 参数运行服务并检查类加载器日志时,有时枚举在启动时未加载。我没有看到任何错误。 有人可以建议任何方法来调试并找到此问题的根本原因吗?

java noclassdeffounderror sshj
1个回答
0
投票

这不符合犹太教规,但我没有代表发表评论。我有同样的问题 - 容器中的 SSHJ,有时我得到

ClassNotFoundException: net.schmizz.sshj.common.DisconnectReason
,并且它一直持续到我重新启动。

你有这样的运气吗?

对我来说,它是从升级许多其他依赖项开始的,迁移到 jakarta 包,从 java 11 到 java 17。我还从 i believe openjdk 切换到 temurin 基础镜像。我可以确认该类位于 jar 内、docker 镜像内。

曾经能够升级到0.38.0,但这并没有解决问题

© www.soinside.com 2019 - 2024. All rights reserved.