Servlets Servlet类不是javax.Servlet.Servlet

Servlets Servlet类不是javax.Servlet.Servlet,servlets,gwt,osgi,Servlets,Gwt,Osgi,我正在开发一个GWT应用程序,但当我将其部署到Equinox jetty服务器时,出现了以下异常: 404 Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"

我正在开发一个GWT应用程序,但当我将其部署到Equinox jetty服务器时,出现了以下异常:

404 Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 404 Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet</title>
</head>
<body><h2>HTTP ERROR 404</h2>
    <p>Problem accessing /baasGUIAutentication/baasgui/autentication. Reason:
    <pre>    
    Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet</pre></p><h3>Caused by:</h3><pre>javax.servlet.UnavailableException: Servlet class com.cartif.gui.autentication.server.AppServiceImpl is not a javax.servlet.Servlet
         at org.mortbay.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:362)
         at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:243)
         at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
         at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
         at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
         at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
         at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
         at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
         at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
         at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startWebAppContext(JettyWarDeployer.java:210)
         at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startDeployment(JettyWarDeployer.java:122)
         at org.springframework.osgi.web.deployer.support.AbstractWarDeployer.deploy(AbstractWarDeployer.java:93)
         at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$DeployTask.doRun(WarLoaderListener.java:257)
         at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$BaseTask.run(WarLoaderListener.java:215)
         at org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:66)
         at java.util.TimerThread.mainLoop(Unknown Source)
         at java.util.TimerThread.run(Unknown Source)

    </pre>
<hr /><i><small>Powered by Jetty://</small></i><br/> 
和应用程序服务:

Bundle-SymbolicName: gwtlibraries; singleton:=true
Require-Bundle: javax.servlet
此外,web.xml声明servlet如下:

Bundle-SymbolicName: GUI; singleton:=true
Require-Bundle: gwtlibraries //apart from importing the specific libraries
Eclipse-RegisterBuddy: com.cartif.gwt
Eclipse-BuddyPolicy: registered
baasgui是编译GWT Java代码的文件夹。我还检查了javax.servlet类,它只使用了一次

有人能帮我吗

提前非常感谢!!
Jose

如果将javax.servlet包嵌入包中,通常会发生这种情况。然后jetty将普通的javax.servlet作为一个捆绑包部署,而您的应用程序只看到嵌入的类。因此,接口被认为是不同的

最好的解决方案是不要在包中嵌入外部内容。如果无法避免,请导出并导入javax.servlet包。因此,框架可以连接jetty,您可以绑定到提供包的同一个类加载器

使用控制台启动equinox 如果是equinox 3.7.x,-Dosgi.console=6666 如果是equinox 3.8或更新版本:-Dosgi.console.enable.builtin=true-Dosgi.console=6666 您将能够远程登录到端口6666 在telnet会话中输入命令:packages javax.servlet 在结果列表中,您将看到该包在OSGi容器中多次可用。Jersey连接其中一个,而wab连接另一个。尝试实现容器中只有一个包。
我找到了解决办法。在GWT库捆绑包中,我必须添加以下行:

标记需要Bundle和singleton Bundle的一部分,而不是导入包。在GUI清单中,我还必须添加下一行:

我部署的GWT库的早期版本没有出现这种情况,但是包结构不同,因为现在我使用的是解压缩库,而在早期版本中使用的是压缩jar文件


感谢您的合作和帮助

这是我得到这个例外的一个相当普通的原因。我从一个旧servlet改编了我的新servlet。在.java文件中的类定义的正上方,有一行类似的代码:@WebServletname=OldServlet,urlPatterns={/OldServlet}。尽管我在java和web.xml文件中正确地将我的类从OldServlet重命名为NewServlet,但我忘了更改上面一行中的名称。在我将上面的行更改为@WebServletname=NewServlet,urlPatterns={/NewServlet}之后,我停止获取此异常。希望这有帮助。

类加载器问题?在不同的类加载器中有两个javax.servlet.servlet类,因此不能将一个类加载器中的servlet转换为另一个类加载器中的javax.servlet.servlet类谢谢您的回答!!!好的,我有捆绑包外部的所有库,在清单中我使用Require bundle=gwt。关于javax.servlet,Web应用程序和librares都没有导入javax.servlet包。那么,我假设他们使用的是GWT发行版的内部包,对吗?是的,这可能是问题所在。好吧!!我还尝试从java.servlet捆绑包中导入javax.servlet包,甚至更多,我已经包含了包的版本,以便确定它应该在哪里查找servlet的捆绑包版本3.0,但它不起作用。你能提供一个小的示例项目来说明你在github或类似的平台上的问题吗?
<servlet>
    <servlet-name>baasguiServlet</servlet-name>
    <servlet-class>com.cartif.gui.autentication.server.AppServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>baasguiServlet</servlet-name>
    <url-pattern>/baasgui/autentication</url-pattern>
</servlet-mapping>
Bundle-SymbolicName: gwtlibraries; singleton:=true
Require-Bundle: javax.servlet
Bundle-SymbolicName: GUI; singleton:=true
Require-Bundle: gwtlibraries //apart from importing the specific libraries
Eclipse-RegisterBuddy: com.cartif.gwt
Eclipse-BuddyPolicy: registered