【问题标题】:How to run a Vaadin 8 or 20 application on Karaf 4.3.2 with Pax-Web?如何使用 Pax-Web 在 Karaf 4.3.2 上运行 Vaadin 8 或 20 应用程序?
【发布时间】:2021-08-24 06:45:41
【问题描述】:

我以为我在某处可以切换:

码头
雄猫
野蝇

但是,对于与feature:install war 一起使用,我再也找不到那个地方了,我也不知道在 Karaf CLI 上输入什么来在三个之间切换。

好像这还不够,我在 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,所以我会先 喜欢尝试其他两个应用程序容器来帮助调试。

如果有的话,谁能给我指点相关文档?

【问题讨论】:

  • Vaadin 8.5.2 和 8.6.x 都相当老了,所以我会先检查 8.6 分支中的任何问题是否已在较新版本中得到修复。据我所知,8.13.1 应该与 Karaf 合作。
  • 我可能应该说恢复到 8.5.2 只是最后的手段,希望这会奏效。原始测试应用程序在这里:github.com/enver-haase/Playground/tree/master/connect4。我也收到 Vaadin 8.13.1 的 403 错误。
  • 运行该安装时是否有任何异常?
  • 不,它似乎工作,似乎部署好 - 然后访问产生一个 403。疯狂的东西:github.com/enver-haase/karibu-helloworld-application 工作,看起来完全一样的应用程序,但用 Kotlin 编写,这里有没有 403。

标签: apache-karaf vaadin8 vaadin-flow apache-karaf-feature


【解决方案1】:

我用 Karaf 4.3.2 + Pax Web 7.3.16 检查了https://github.com/enver-haase/Playground/tree/master/connect4,问题出在org.springframework.web.SpringServletContainerInitializer#onStartup() 方法上。或者更确切地说是 Pax Web (pax-web-extender-war) 的处理方式。

SpringServletContainerInitializer 注释为:

@HandlesTypes(WebApplicationInitializer.class)

这意味着(根据 JavaEE Servlets 规范)给我所有实现 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"

并且 Vaadin 可以成功启动。

我检查了 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() 的默认实现(根据 OSGi CMPN 140 白板规范,它应该抛出 UnsupportedOperationException...) - 我修复了它。

但是现在,当 spring-boot-web 尝试配置(我看到它被正确调用)调度程序 servlet 时,它无法将其映射到“/”路径下,因为已经映射了默认 servlet。根据 Servlets 规范,这是不可能的,但 Tomcat 将来自 conf/web.xmldefaultjsp)的 servlet 标记为 override'able,我必须在 Pax Web 8 中做同样的事情......

重点是 - 感谢非常复杂的示例,我一定会将它变成 Pax Web 8 的集成测试。很快(ish)。

【讨论】:

  • 我刚刚将一个 war-vaadin08-spring 示例推送到 Pax Web 8 - github.com/ops4j/org.ops4j.pax.web/tree/main/samples/…。这是一个带有 OSGi 清单的适当 WAB(一个 Web 包),它嵌入了 Spring Boot 1.5.22 和 Vaadin 8.13.2。上述所有问题均已修复,应用程序可在 pax-web-jett|tomcat|undertow 上运行。唯一不起作用的是@org.springframework.context.annotation.ComponentScan注解(这是OSGi中Spring的问题),所以我只是手动添加了所有配置类。
最近更新 更多