Как запустить приложение Vaadin 8 или 20 на Karaf 4.3.2 с помощью Pax-Web?

пожалуйста, простите меня, если это неправильное место, чтобы спросить: я не нашел лучшего.

Я думал, что где-то читал, что можно переключаться между

Причал TomcatWildfly

для использования с feature:install war .

Однако я больше не могу найти это место, я не знаю, что ввести в CLI Karaf, чтобы переключаться между тремя.

Как будто этого было недостаточно, у меня мало успеха с Jetty (версия 9.4.40v20210413, похоже, находится в Karaf 4.3.2, которая достаточно свежая, поэтому в принципе должна работать!)

Я попытался развернуть приложение Vaadin 8.5.2 (я читал, что из 8.6 что-то может сломаться, что я не хочу исследовать в первую очередь).

      karaf@root()> web:list
ID  │ State       │ Web-State   │ Level │ Web-ContextPath │ Name
────┼─────────────┼─────────────┼───────┼─────────────────┼────────────────────────────────
110 │ Active      │ Failed      │ 80    │ /learningfusion │ 
learningfusion (1.0.0.SNAPSHOT)
111 │ Active      │ Deployed    │ 80    │ /connect4       │ connect4 (1.0.0)

Таким образом, приложение connect4 должно работать нормально, но просмотр localhost:8181/connect4 дает мне ошибку 403.

Как я могу это исправить? (Команды ценятся больше, чем «что делать», так как я, возможно, в настоящее время не понимаю, «как» достичь этого, будучи новичком в этом отношении, как и я).

А другое приложение в списке - это приложение в производственном режиме Vaadin20, которое дает мне NPE при запуске, поэтому я сначала хотел бы попробовать два других контейнера приложений для облегчения отладки.

Может ли кто-нибудь указать мне на соответствующую документацию, если она есть.

Я прошу прощения и чувствую себя немного глупо, но обещаю, что пытался найти это сам. Даже «позвольте мне погуглить, что для вас» очень ценится, если это подскажет мне правильные ключевые слова для поиска, которые я должен был использовать.

Большое спасибо за уделенное время, - Энвер

1 ответ

Я проверил https://github.com/enver-haase/Playground/tree/master/connect4 с Karaf 4.3.2 + Pax Web 7.3.16, и проблема связана с org.springframework.web.SpringServletContainerInitializer#onStartup()метод. Или, скорее, с тем, как это обрабатывается Pax Web (pax-web-extender-war).

SpringServletContainerInitializer аннотируется:

      @HandlesTypes(WebApplicationInitializer.class)

Это означает (согласно спецификации сервлетов JavaEE) дать мне все классы, реализующие WebApplicationInitializerинтерфейс .

Но Pax Web 7 (хотя я исправил его в еще не выпущенном Pax Web 8) просто пропускает WebApplicationInitializer.class сам.

Это приводит к ситуации, когда Spring Web просто вызывает:

      servletContext.log("No Spring WebApplicationInitializer types detected on classpath");

Хотя (при проверке на Tomcat) список классов (как и ожидалось):

      webAppInitializerClasses: java.util.Set  = {java.util.HashSet@2416}  size = 6
 0 = {@2419} "class com.infraleap.connect4.Connect4Application"
 1 = {@2420} "class org.springframework.web.context.AbstractContextLoaderInitializer"
 2 = {@2421} "class org.springframework.boot.web.support.SpringBootServletInitializer"
 3 = {@2422} "class org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer"
 4 = {@2423} "class org.springframework.web.servlet.support.AbstractDispatcherServletInitializer"
 5 = {@2424} "class org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer"

и Ваадин может успешно стартовать.

Я проверил на Pax Web 8 (еще не выпущен), и набор правильный:

      webAppInitializerClasses = {java.util.LinkedHashSet@7795}  size = 6
 0 = {@7798} "class org.springframework.web.context.AbstractContextLoaderInitializer"
 1 = {@7799} "class org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer"
 2 = {@7800} "class com.infraleap.connect4.Connect4Application"
 3 = {@7801} "class org.springframework.web.servlet.support.AbstractDispatcherServletInitializer"
 4 = {@7802} "class org.springframework.boot.web.support.SpringBootServletInitializer"
 5 = {@7803} "class org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer"

И я обнаружил, что мне нужно изменить реализацию по умолчанию org.ops4j.pax.web.service.spi.servlet.OsgiDynamicServletContext#setInitParameter() (это должно бросить UnsupportedOperationException согласно спецификации OSGi CMPN 140 Whiteboard ...) - Я исправил.

Но теперь состояние таково, что когда spring-boot-web пытается настроить (я вижу, что он вызывается правильно) сервлет диспетчера, он не может сопоставить его по пути '/', так как сервлет по умолчанию уже сопоставлен. Согласно спецификации сервлетов это невозможно, но Tomcat помечает сервлеты из conf/web.xml ( default а также jsp) как override'able, и я должен сделать то же самое в Pax Web 8...

Дело в том, что спасибо за очень сложный пример, и я обязательно превращу его в интеграционный тест Pax Web 8. Скоро (иш).

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