1

我正在使用一个可运行的 jar(带有依赖项)来启动一个嵌入式 tomcat,该 tomcat 托管一个使用 struts2 和 websockets 的 web 应用程序。

该应用程序在Tomcat安装中运行时可以正常工作,但是当从提到的可运行 jar 运行时,websocket 容器未初始化,导致404尝试连接到相应的端点时响应。

我将问题缩小到发现进程,该进程读取META-INF/Services/javax.servlet.ServerContainerInitializer不同的 jar 文件以查找为服务器初始化服务的类。特别是,初始化 Websockets Container 的类是org.apache.tomcat.websocket.server.WsSci.

据我所见,WsSci该类已由 maven 程序集插件重新打包在可运行的 jar 中,但该META-INF/Services/javax.servlet.ServerContainerInitializer文件没有像原始 jar 那样提到这个类,它只提到了org.apache.jasper.servlet.JasperInitializer初始化程序。

有什么办法可以让可运行的 jar 保持原样,并WebSockets Container通过调用Tomcat类上的某个方法以编程方式请求初始化?或者请求web.xml文件中的初始化?

注意:作为一项工作,我可以看到,如果我将WsSci类手动添加到META-INF/Services/javax.servlet.ServerContainerInitializer可运行 jar 中的新文件中,则Websockets Containter初始化正确。

4

1 回答 1

0

我遇到了类似的问题,问题可能是类加载器,

Tomcat 从父类加载器加载 ServerContainerInitializer

    String configFile = "META-INF/services/" + serviceType.getName();
    ClassLoader loader = this.context.getParentClassLoader();

可能在您的 tomcat 初始化代码中,您可以设置为使用您的类加载器而不是 webApp 类加载器。

tomcatContext.setParentClassLoader(this.getClass().getClassLoader());

于 2021-10-21T15:31:43.407 回答