2016-01-21 151 views
0

我想用Maven和Tomcat 7构建一个可执行的WAR/JAR。 该项目包含Websocket和REST API。用Maven,Tomcat 7和Websocket构建一个可执行的War/Jar

为了做到这一点,我添加了以下插件pom.xml文件:

<groupId>org.apache.tomcat.maven</groupId> 
      <artifactId>tomcat7-maven-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <id>tomcat-run</id> 
        <goals> 
         <goal>exec-war-only</goal> 
        </goals> 
        <phase>package</phase> 
        <configuration> 
         <path>/TransSafeGWService</path> 
         <enableNaming>false</enableNaming> 
         <finalName>standalone.jar</finalName> 
         <charset>utf-8</charset> 
        </configuration> 
       </execution> 
      </executions> 

后,由于REST服务是工作,但WebSocket的服务是不是,我添加其他依赖于插件:

 <plugin> 
      <groupId>org.apache.tomcat.maven</groupId> 
      <artifactId>tomcat7-maven-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <id>tomcat-run</id> 
        <goals> 
         <goal>exec-war-only</goal> 
        </goals> 
        <phase>package</phase> 
        <configuration> 
         <path>/TransSafeGWService</path> 
         <enableNaming>false</enableNaming> 
         <finalName>standalone.jar</finalName> 
         <charset>utf-8</charset> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat7-websocket</artifactId> 
        <version>7.0.67</version> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-util</artifactId> 
        <version>7.0.67</version> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-coyote</artifactId> 
        <version>7.0.67</version> 
       </dependency> 

      </dependencies> 
     </plugin> 

使用的依赖,我得到这样的错误:

java.lang.NoSuchMethodError: org.apache.catalina.connector.RequestFacade.upgrade(Ljava/lang/Class;)Lorg/apache/coyote/http11/upgrade/servlet31/HttpUpgradeHandler; 
    at org.apache.tomcat.websocket.server.UpgradeUtil.doUpgrade(UpgradeUtil.java:238) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

在这种情况可能是什么问题?

下面完整的pom.xml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.ti.white</groupId> 
<artifactId>TransSafeGWService</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<name>TransSafeGWService</name> 
<url>http://maven.apache.org</url> 
<dependencies> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-servlet</artifactId> 
     <version>1.18</version> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.jettison</groupId> 
     <artifactId>jettison</artifactId> 
     <version>1.3.7</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.websocket</groupId> 
     <artifactId>javax.websocket-api</artifactId> 
     <version>1.0</version> 
     <scope>provided</scope> 
    </dependency> 



</dependencies> 

<build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <configuration> 
       <webXml>WebContent\WEB-INF\web.xml</webXml> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.3</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.tomcat.maven</groupId> 
      <artifactId>tomcat7-maven-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <id>tomcat-run</id> 
        <goals> 
         <goal>exec-war-only</goal> 
        </goals> 
        <phase>package</phase> 
        <configuration> 
         <path>/TransSafeGWService</path> 
         <enableNaming>false</enableNaming> 
         <finalName>standalone.jar</finalName> 
         <charset>utf-8</charset> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat7-websocket</artifactId> 
        <version>7.0.67</version> 
       </dependency> 


       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-util</artifactId> 
        <version>7.0.67</version> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-coyote</artifactId> 
        <version>7.0.67</version> 
       </dependency> 

      </dependencies> 
     </plugin> 

    </plugins> 
</build> 

按照要求,下面有web.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>TransSafeGWService</display-name> 
    <servlet> 
    <servlet-name>Data Acquisition Service</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.ti.transafe.acquisitionService</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Data Acquisition Service</servlet-name> 
    <url-pattern>/Service/* </url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

回答

0

我觉得你的问题很可能是用错servlet api的版本。 Tomcat 7支持3.0及更低版本,但似乎您使用的是servlet版本3.1。

你的例外显示this method not found,这只是servlet 3.1或更高版本的一部分。

Since: 
Servlet 3.1 

即使你没有列入讨论的web.xml文件,堆栈跟踪导致该决议

请参阅您的web.xml有这个声明。

<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
    http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

更新:

您正在使用2.1版本tomcat7-maven-plugin它使用Tomcat版本7.0.37。然后在依赖关系中,您尝试使用不同版本7.0.67的tomcat jar。两者必须使用相同的版本。

你有两种可能性:

  1. 任何一个所有罐子的版本7.0.37

  2. 您可以使用最新版本的2.2 of tomcat7-maven-plugin和使用属性setting the tomcat version。我会 喜欢这一个。也许你可以用2.1来设置这个属性。你可以尝试 。

+0

我在前一篇文章中添加了web.xml描述。它已经有了你写的声明。 – ant

+0

请看我更新的答案 – awsome