首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Pax-Web在Karaf 4.3.2上运行Vaadin 8或20应用程序?

如何使用Pax-Web在Karaf 4.3.2上运行Vaadin 8或20应用程序?
EN

Stack Overflow用户
提问于 2021-06-07 15:04:52
回答 1查看 85关注 0票数 1

我想我在某处读到了一个人可以在以下几点之间切换:

码头

Tomcat

野蝇

然而,对于feature:install war的使用,我既找不到那个地方,也不知道在Karaf CLI上输入什么才能在三者之间切换。

如果这还不够,我在Jetty上几乎没有成功( 9.4.40v20210413版本似乎是在Karaf 4.3.2中,这是相当新的,所以原则上应该可以工作)。

我试图部署一个Vaadin 8.5.2应用程序(我从8.6中了解到一些东西可能会被破坏,我不想把它作为第一件事来研究)。

代码语言:javascript
复制
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/connec4会给我一个403错误。

我该如何解决这个问题呢?(命令比“做什么”更受欢迎,因为我目前可能不知道“如何”实现这一点,因为我是这方面的初学者)。

列表中的另一个应用程序是Vaadin20生产模式应用程序,它在启动时为我提供了NPE,因此我想首先尝试使用其他两个应用程序容器来帮助调试。

如果有相关文档的话,有人可以告诉我吗?

EN

回答 1

Stack Overflow用户

发布于 2021-06-21 19:18:08

我用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使用以下注释进行注释:

代码语言:javascript
复制
@HandlesTypes(WebApplicationInitializer.class)

这意味着(根据JavaEE Servlet规范)给出实现WebApplicationInitializer接口的所有类。

但是PaxWeb7(尽管我已经在还没有发布的PaxWeb8中修复了它)只是简单地传递了WebApplicationInitializer.class本身。

这导致了这样的情况,Spring Web只是调用:

代码语言:javascript
复制
servletContext.log("No Spring WebApplicationInitializer types detected on classpath");

而(在Tomcat上检查时),类的列表是(正如预期的):

代码语言:javascript
复制
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(还没有发布),设置是正确的:

代码语言:javascript
复制
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 CMPN140白板规范抛出UnsupportedOperationException ...)-我修复了它。

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

关键是--感谢非常复杂的例子,我一定会把它变成Pax Web8的集成测试。很快(差不多)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67867281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档