我正在使用一个可运行的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(((;