Используя встроенный Tomcat 8, как я могу инициализировать контейнер Websocket, если tomcat-embed-websocket.jar отсутствует в пути к классу?
Я использую runnable jar (with-depenencies), чтобы запустить встроенный tomcat, на котором размещено веб-приложение, использующее struts2 и веб-сокеты.
Приложение работает нормально при работе в Tomcat
установка, но при запуске из упомянутого работающего jar-файла контейнер веб-сокета не инициализируется, что приводит к 404
ответы при попытке подключиться к соответствующей конечной точке.
Я сузил проблему до процессов обнаружения, которые читаются META-INF/Services/javax.servlet.ServerContainerInitializer
различных файлов jar, чтобы найти классы, которые инициализируют службы для сервера. В частности, класс, который инициализирует контейнер Websockets, - этоorg.apache.tomcat.websocket.server.WsSci
.
Насколько я могу видеть WsSci
класс был переупакован в runnable jar плагином сборки maven, но META-INF/Services/javax.servlet.ServerContainerInitializer
файл не упоминает этот класс, как это было в исходной банке, он упоминает только org.apache.jasper.servlet.JasperInitializer
инициализатор.
Есть ли способ оставить работающую банку как есть и программно запросить WebSockets Container
инициализация путем вызова некоторого метода на Tomcat
учебный класс? Или запросите инициализацию вweb.xml
файл?
Примечание: в качестве рабочей области я мог видеть, что если я добавлю WsSci
класс вручную в новый META-INF/Services/javax.servlet.ServerContainerInitializer
файл в работающей банке, Websockets Containter
инициализируется правильно.
1 ответ
Я столкнулся с подобной проблемой, проблема могла быть в classloader,
Tomcat загружает ServerContainerInitializer из родительского загрузчика классов
String configFile = "META-INF/services/" + serviceType.getName();
ClassLoader loader = this.context.getParentClassLoader();
Вероятно, в вашем коде инициализации tomcat вы можете настроить использование загрузчика классов вместо загрузчика классов webApp.
tomcatContext.setParentClassLoader (this.getClass().getClassLoader());