使用嵌入式 Tomcat 8,如果 tomcat-embed-websocket.jar 不在类路径中,如何初始化 We



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

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

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

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

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

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

我遇到了类似的问题,问题可能是claassloader,

Tomcat 从父类加载器加载 ServerContainerInitializer

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

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

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

相关内容

最新更新