为什么当我尝试 运行 已部署的 zk war 时得到 java.lang.ClassNotFoundException: org.zkoss.zk.ui.http.HttpSessionListener?

Why do I get java.lang.ClassNotFoundException: org.zkoss.zk.ui.http.HttpSessionListener when I try to run a deployed zk war?

我正在尝试 运行 使用 zk 框架和 Java 部署的 .war,在具有 tomcat 10 的 Debian 服务器中,但它没有工作。我查看文件/opt/tomcat/logd/localhost.2021-xx-xx.log中的日志时,出现错误信息如下:

java.lang.ClassNotFoundException: org.zkoss.zk.ui.http.HttpSessionListener 

然后,我在互联网上进行了一些研究,找到了一个可能的解决方案 link https://forum.zkoss.org/question/97112/javalangclassnotfoundexception-orgzkosszkuihttphttpsessionlistener/,然后我按照建议做了。但是,错误继续出现。看来zk框架和服务端有冲突

我发现了两个可能导致此问题的潜在问题。

首先: Tomcat 10 实施 Jakarta servlet(而不是 java servlet)。 构建应用程序时,请确保您使用的是正确的 ZK 版本。 最后一个 ZK 版本有两个版本:

  • 9.6.0 : Java EE(tomcat 9 及以下)
  • 9.6.0-Jakarta:Jakarta EE(tomcat 仅 10 个)

请参阅此处 the configuration guide

请注意,如果您是 运行 tomcat 10 中 ZK 的 Java EE 版本,我希望您得到:

[org.zkoss.zk.ui.http.HttpSessionListener]
    java.lang.NoClassDefFoundError: javax/servlet/ServletRequestAttributeListener

与您当前的问题位于同一位置,但不完全相同 :D

其次:如果你是通过maven或者gradle等依赖管理工具来解析你的依赖,有可能是你解析错了依赖。

我建议仔细检查已解决的依赖关系,以确保每个 ZK jar 都在同一版本中得到解决。

您的主声明可能有一个 ZK 版本,而另一个来自插件(例如 Keikai、ZK 电子表格或 ZK 图表)

以 Maven 为例,运行依赖树命令是了解已解决内容的好方法。