Java 部署tomcat 8后无法启动web服务

Java 部署tomcat 8后无法启动web服务,java,tomcat,exception,Java,Tomcat,Exception,我在Tomcat7下毫无问题地部署了我的Web服务 因为我试图在Tomcat8下安装一个新的WebServices实例。 它似乎有一些问题,webapp已部署,但当我尝试时: 它只返回空白页 这是尝试启动服务器时获取的catalina错误日志: 30-Jun-2016 10:56:27.149 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBas

我在Tomcat7下毫无问题地部署了我的Web服务

因为我试图在Tomcat8下安装一个新的WebServices实例。 它似乎有一些问题,webapp已部署,但当我尝试时:

它只返回空白页

这是尝试启动服务器时获取的catalina错误日志:

30-Jun-2016 10:56:27.149 SEVERE [localhost-startStop-1]
org.apache.catalina.core.ContainerBase.addChildInternal   ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component     [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/VICWebServices]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:587)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1798)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
at org.apache.tomcat.websocket.server.WsServerContainer.<init>(WsServerContainer.java:150)
at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131)
at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5292)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)

30-Jun-2016 10:56:27.149 SEVERE [localhost-startStop-1]     org.apache.catalina.startup.HostConfig.deployDescriptor Error deploying configuration descriptor C:\apache-tomcat-8.0.36-AWS-VIC-PROD-2\conf\Catalina\localhost\VICWebServices.xml
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/VICWebServices]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:729)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:587)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1798)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

30-Jun-2016 10:56:27.150 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of configuration descriptor C:\apache-tomcat-8.0.36-AWS-VIC-PROD-2\conf\Catalina\localhost\VICWebServices.xml has finished in 21,855 ms
30-Jun-2016 10:56:27.152 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8280"]
30-Jun-2016 10:56:27.162 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8209"]
30-Jun-2016 10:56:27.166 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 21903 ms
信息是

NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
这意味着您针对包含此方法的servlet库版本编译了代码,但部署WAR文件的服务器运行的版本(可能更早)不包含此方法

确保在构建和部署环境中使用相同的API版本。

消息如下:

NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String;
这意味着您针对包含此方法的servlet库版本编译了代码,但部署WAR文件的服务器运行的版本(可能更早)不包含此方法


确保在构建和部署环境中使用相同的API版本。

最可能的原因是您在战争中打包了旧版本的API(tomcat应该忽略它),或者您将该版本放在了tomcat/lib中

您可以通过运行带有详细类加载的tomcat来识别有问题的JAR。这可以通过向JVM参数添加
-verbose:class
来实现。您可以通过将其添加到环境变量JAVA_OPTS中,将其添加到此处:

  • 在linux上:
    export JAVA\u OPTS=-verbose:class
  • 在windows上:
    set JAVA\u OPTS=-verbose:class
然后,当您启动tomcat时,您将获得许多类似于以下内容的输出:

[Loaded javax.websocket.server.ServerEndpointConfig$Builder from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/websocket-api.jar]
[Loaded javax.websocket.server.ServerEndpointConfig from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/websocket-api.jar]
[Loaded org.apache.tomcat.websocket.server.DefaultServerEndpointConfigurator from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/tomcat-
[Loaded javax.websocket.server.DefaultServerEndpointConfig from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/websocket-api.jar]
[Loaded org.apache.tomcat.websocket.pojo.PojoMethodMapping from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/tomcat-websocket.jar]

然后找出加载的servlet上下文来自哪个jar,如果它不是来自tomcat或修复它的版本,则将其删除。

最可能的原因是您在WAR中打包了一个较旧版本的API(tomcat应该忽略它),或者您已将该版本放在tomcat/lib中

您可以通过运行带有详细类加载的tomcat来识别有问题的JAR。这可以通过向JVM参数添加
-verbose:class
来实现。您可以通过将其添加到环境变量JAVA_OPTS中,将其添加到此处:

  • 在linux上:
    export JAVA\u OPTS=-verbose:class
  • 在windows上:
    set JAVA\u OPTS=-verbose:class
然后,当您启动tomcat时,您将获得许多类似于以下内容的输出:

[Loaded javax.websocket.server.ServerEndpointConfig$Builder from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/websocket-api.jar]
[Loaded javax.websocket.server.ServerEndpointConfig from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/websocket-api.jar]
[Loaded org.apache.tomcat.websocket.server.DefaultServerEndpointConfigurator from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/tomcat-
[Loaded javax.websocket.server.DefaultServerEndpointConfig from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/websocket-api.jar]
[Loaded org.apache.tomcat.websocket.pojo.PojoMethodMapping from file:/C:/Users/xxx/Downloads/software/apache-tomcat-8.0.36/apache-tomcat-8.0.36/lib/tomcat-websocket.jar]

然后查找从哪个jar加载servlet上下文,如果它不是来自tomcat或修复它的版本,则将其删除。

您必须使用支持tomcat 8的最新jar更新旧jar 例如,一些restfull api只支持Tomcat7而不支持8 所以你必须把迟到的罐子放进去


jersey 1.7支持tomcat 7及以下版本

您必须使用支持tomcat 8的最新JAR更新旧JAR 例如,一些restfull api只支持Tomcat7而不支持8 所以你必须把迟到的罐子放进去



jersey 1.7支持tomcat 7及以下版本

寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。可能相关:更新了服务器提供的servlet api
javax.servlet.ServletContext.getVirtualServerName()
存在于api 7的ServletContext中,但不存在于api 6中。寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。可能相关:更新了服务器提供的servlet api
javax.servlet.ServletContext.getVirtualServerName()存在于api 7中的ServletContext中,但不存在于api 6中。您指的是哪个jar?webapp war文件或tomcat库中的JAR?您的项目中很少有库需要更新,您必须检查我是否更新了详细:类日志,请查看。您指的是哪个JAR?webapp war文件或tomcat库中的JAR?您项目中的少数库需要更新,您必须检查我是否已更新详细:类日志,请看一看。这个问题有没有解决方案不需要修改我现有的WebService.war文件?您可能需要在服务器上部署更新版本的servlet容器。服务器上的应用程序服务器和版本是什么?您是根据哪个版本编译的?tomcat 8.0.36是web容器?很抱歉,我对所有术语都有点困惑。是否有任何解决方案不需要修改我现有的WebService.war文件即可解决此问题?您可能需要在服务器上部署更新版本的servlet容器。服务器上的应用程序服务器和版本是什么?您是根据哪个版本编译的?tomcat 8.0.36是web容器?很抱歉,我对所有的术语感到有点困惑。tomcat/lib fold在安装后保持不变,这是否意味着问题来自实际的WAR文件,并且必须使用新版本的API重新编译?问题是因为JVM加载了旧版本的API。按照我在回答中所说的去寻找罪魁祸首。我已经用所有与servletcontext相关的行更新了verbose:class日志,你是说问题是由这些文件引起的吗?是的,是包含它们的jar。tomcat/lib fold自安装以来保持不变,这是否意味着问题来自实际的WAR文件,它必须用新版本的API重新编译?问题在于JVM加载了旧版本的API。按照我在回答中所说的去寻找罪魁祸首。我已经用所有与servletcontext相关的行更新了verbose:class日志,你是说这个问题是由