我正在开发一个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/> AppServiceImpl类的代码头是:
public class AppServiceImpl extends RemoteServiceServlet implements AppService 和AppService:
@RemoteServiceRelativePath("autentication")
public interface AppService extends RemoteService {
User getUser(String user, String pass) throws Exception;
}此外,web.xml声明servlet如下:
<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>baasgui是编译GWT Java代码的文件夹。我还检查了javax.servlet类,并且只使用了一次。
有人能帮我吗?
提前谢谢!何塞
发布于 2014-04-04 09:51:56
我找到解决办法了。在GWT库包中,我必须添加以下行:
Bundle-SymbolicName: gwtlibraries; singleton:=true
Require-Bundle: javax.servlet标记不需要导入包,而是需要- bundle和部分单例包。在GUI清单中,我还必须添加下一行:
Bundle-SymbolicName: GUI; singleton:=true
Require-Bundle: gwtlibraries //apart from importing the specific libraries
Eclipse-RegisterBuddy: com.cartif.gwt
Eclipse-BuddyPolicy: registered我所部署的GWT库的早期版本并没有出现这种情况,但是包结构是不同的,因为现在我使用的是解压缩的库,而在以前的版本中使用的是压缩的jar文件。
感谢您的合作和帮助!
发布于 2014-03-28 11:30:16
当将javax.servlet包嵌入到包中时,通常会发生这种情况。然后,jetty会看到作为一个包部署的普通javax.servlet,而您的应用程序只看到嵌入的类。因此,接口被认为是不同的。
最好的解决方案是不要将外部内容嵌入到包中。如果无法避免,则导出和导入javax.servlet包。因此,框架可以将jetty连接起来,并将其捆绑到提供包的相同的类加载器上。
发布于 2014-03-28 13:54:27
https://stackoverflow.com/questions/22710535
复制相似问题