我有一个春季启动应用程序在eclipse运行正常。当我构建它并从命令行运行它时会失败并出现异常。
问题似乎是servlet版本不匹配,但我不明白为什么。
注意我不使用Maven或Gradle可能也很重要。 : - (
我的跑步命令:
java -jar Demo.jar
例外:
Sep 15, 2015 7:30:24 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.apache.tomcat.websocket.server.WsContextListener
java.lang.NoSuchMethodError:
javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
at org.apache.tomcat.websocket.server.WsServerContainer.<init>(WsServerContainer.java:147)
at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131)
at org.apache.tomcat.websocket.server.WsContextListener.contextInitialized(WsContextListener.java:39)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4729)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我的MANIFEST.MF在类路径中设置了这些tomcat jar。它们存在且易于使用。
../../JavaJars.461248/lib/tomcat-embed-core-8.0.23.jar
../../JavaJars.461248/lib/tomcat-embed-el-8.0.23.jar
../../JavaJars.461248/lib/tomcat-embed-logging-juli-8.0.23.jar
../../JavaJars.461248/lib/tomcat-embed-websocket-8.0.23.jar
那些位置看起来有点奇怪,但文件就在那里。如果我删除了,我得到一个与没有servlet相关的不同启动异常。
我认为getVirtualServerName在servlet的3.1版本中,我认为这些版本的tomcat具有。令人困惑的是,这些相同的文件都在我的eclipse类路径中,我没有遇到麻烦。
有关我缺少的任何建议吗?
答案 0 :(得分:1)
答案 1 :(得分:1)
小心使用spring启动插件,因为它似乎添加了类路径提供的范围依赖项。当emebedded tomcat启动Web套接字上下文时,我遇到了这个异常。
我的情况下的问题只会发生在使用spring-boot:run目标。
原因是gwt-user.jar包捆绑了较旧的
public interface ServletContext {
没有方法的API。
另一方面,tomcat被期望将加载的ServletContext类作为tomcat-embedded-core-8.0.30.jar的一部分,这是spring boot默认配置的一部分。
解决问题的方法是使用以下方法调整spring-boot插件:
<excludes>
<exclude>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
</exclude>
</excludes>
生产jar以及netbeans调试类运行完美,只有插件才会发生此错误。
无论如何,它是典型的classpath vodoo异常。如果您有一个好的IDE,请查找类型并在所有依赖项中搜索ServletContext类。如果你找到不同的API ......好吧。