Используя встроенный 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());

Другие вопросы по тегам