Как запустить приложение 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. Скоро (иш).