使用java -jar和Tomcat 8弹出启动getVirtualServerName .STS运行正常

时间:2015-09-16 00:42:18

标签: java tomcat spring-boot

我有一个春季启动应用程序在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类路径中,我没有遇到麻烦。

有关我缺少的任何建议吗?

2 个答案:

答案 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 ......好吧。