我想我在某处读到了一个人可以在以下几点之间切换:
码头
Tomcat
野蝇
然而,对于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/connec4会给我一个403错误。
我该如何解决这个问题呢?(命令比“做什么”更受欢迎,因为我目前可能不知道“如何”实现这一点,因为我是这方面的初学者)。
列表中的另一个应用程序是Vaadin20生产模式应用程序,它在启动时为我提供了NPE,因此我想首先尝试使用其他两个应用程序容器来帮助调试。
如果有相关文档的话,有人可以告诉我吗?
发布于 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使用以下注释进行注释:
@HandlesTypes(WebApplicationInitializer.class)这意味着(根据JavaEE Servlet规范)给出实现WebApplicationInitializer接口的所有类。
但是PaxWeb7(尽管我已经在还没有发布的PaxWeb8中修复了它)只是简单地传递了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 CMPN140白板规范抛出UnsupportedOperationException ...)-我修复了它。
但现在的状态是,当spring-boot-web尝试配置(我看到它被正确调用) dispatcher servlet时,它无法将其映射到'/‘路径下,因为已经映射了默认的servlet。根据Servlets规范,这是不可能的,但是Tomcat将来自conf/web.xml (default和jsp)的servlets标记为override‘’able,我必须在Pax Web8中做同样的事情……
关键是--感谢非常复杂的例子,我一定会把它变成Pax Web8的集成测试。很快(差不多)。
https://stackoverflow.com/questions/67867281
复制相似问题