在Felix Jetty中部署捆绑软件时,Servlet类不是javax.servlet.Servlet

时间:2018-07-11 11:52:50

标签: servlets jetty osgi apache-felix osgi-bundle

我正在尝试在felix码头部署OSGI捆绑包。 BootStrap是我的扩展HttpServlet的类。

我在部署阶段遇到以下异常:

ins.server.servlet.HttpServlet30Dispatcher is not assignable from javax.servlet.http.HttpServlet
2018-07-11T07:46:55,044 WARN sure-rest-neo [] web-reactor - unavailable
javax.servlet.UnavailableException: Servlet class com.nokia.mdf.sure.neo.utils.Bootstrap is not a javax.servlet.Servlet
        at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:519) ~[jetty-servlet-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:379) ~[jetty-servlet-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:874) ~[jetty-servlet-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:349) ~[jetty-servlet-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1404) ~[jetty-webapp-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1366) ~[jetty-webapp-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778) ~[jetty-server-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262) ~[jetty-servlet-9.3.10.v20160621.jar:9.3.10.v20160621]
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:520) ~[jetty-webapp-9.3.10.v20160621.jar:9.3.10.v20160621]

我已经嵌入了所有依赖项,包括可传递的依赖项。我认为这是由于jar冲突引起的,该如何解决?

1 个答案:

答案 0 :(得分:3)

问题恰恰与嵌入依赖关系有关。当您嵌入javax.servlet包时,您的捆绑包将使用嵌入式类,而jetty将使用导出的包中可用的类。因此,尽管这些类的名称相同,但在类加载器中存在不同的实例,这完全导致了这种错误。

通常,要解决此问题,请确保理想情况下,每个包仅导出一个包,而需要该包的所有包都导入该包。因此,最简单的解决方案是不嵌入依赖项。

如果这对您不起作用,则可以尝试在捆绑包中导入和导出javax.servlet包。这样,OSGi环境就可以决定将其实际连接到哪个软件包,并避免在束中具有不同实例的情况下使用相同的类名。