You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Marek Jagielski <ma...@gmail.com> on 2013/11/07 15:45:49 UTC

tomcat7-websocket - tomcat7-maven-plugin java.lang.ClassNotFoundException: javax.servlet.http.HttpUpgradeHandler

Hello,
I am migrating my websocket application to the new API with version 7.0.47.
How can correctly make a configuration of tomcat7-maven-plugin to use
tomcat7-websocket on localhost.
Here what I have in my pom:
...
<dependencies>
  ...

<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-catalina</artifactId></dependency>

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

<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat7-websocket</artifactId></dependency>
</dependencies>
     ...
</plugins>
  <plugin>

<groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId>
                    <configuration>
                        <url></url>
                        <server></server>
                        <path>/</path>
                        <port>7443</port>
                        <httpsPort>0</httpsPort>
                        <keystorePass>catmot</keystorePass>

<tomcatUsers>src/main/tomcatconf/tomcat-users.xml</tomcatUsers>
                </configuration>
            </plugin>
  </plugins>
  </build>
</project>


and my parent pom:
...
<dependencyManagement>
...
  <dependencies>

<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-catalina</artifactId><version>7.0.47</version><scope>provided</scope></dependency>

<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-coyote</artifactId><version>7.0.47</version><scope>provided</scope></dependency>

<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat7-websocket</artifactId><version>7.0.47</version><scope>provided</scope></dependency>
<dependency><groupId>javax</groupId><artifactId>javaee-web-api</artifactId><version>6.0</version><scope>provided</scope></dependency>
  </dependencies>
</dependencyManagement>
...

  <pluginManagement>
  <plugins>
<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version>
<dependencies>
<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-catalina</artifactId><version>7.0.47</version><scope>runtime</scope></dependency>
<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-coyote</artifactId><version>7.0.47</version><scope>runtime</scope></dependency>
<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat7-websocket</artifactId><version>7.0.47</version><scope>runtime</scope></dependency>
</dependencies> </plugin>
  </plugins>
        </pluginManagement>
  </build>
</project>


When using simple server end point

@ServerEndpoint(value="/connector")
public class MachineWsConnector {
    @OnOpen
    public void onOpen(Session session) { }

  @OnClose
  public void onClose(Session session, CloseReason closeReason) { }
}

and trying to connect with client with:

WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.connectToServer(Client.class, new
URI("ws://localhost:7443/connector"));

I get error on client side:
Exception in thread "main" javax.websocket.DeploymentException: The HTTP
response from the server [HTTP/1.1 500 Internal Server Error
] did not permit the HTTP upgrade to WebSocket
at
org.apache.tomcat.websocket.WsWebSocketContainer.parseStatus(WsWebSocketContainer.java:601)
at
org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:585)
at
org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:317)
at
org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:183)
at
org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:204)
at com.systemincloud.api.machine.java.Client.main(Client.java:49)

and on server side:

java.lang.ClassNotFoundException: javax.servlet.http.HttpUpgradeHandler
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:788)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2918)
at
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1174)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
at
org.apache.tomcat.websocket.server.UpgradeUtil.doUpgrade(UpgradeUtil.java:174)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:76)
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:502)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
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:724)

Thanks in advance,

Marek

Re: tomcat7-websocket - tomcat7-maven-plugin java.lang.ClassNotFoundException: javax.servlet.http.HttpUpgradeHandler

Posted by Marek Jagielski <ma...@gmail.com>.
In tomcat's svn history I see that looked method was added to InstanceManager
(tomcat-api) when Back-porting JSR-356:

+ public Object newInstance(Class<?> clazz)

+ throws IllegalAccessException, InvocationTargetException, NamingException,

+ InstantiationException;

+


However, I solved the problem by adding explicitly


<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-api</artifactId><version>7.0.47</version><scope>runtime</scope></dependency>

into <pluginManagement> <dependencies>

I hope that this topic can be at least useful for others.
Thanks,

Marek

Re: tomcat7-websocket - tomcat7-maven-plugin java.lang.ClassNotFoundException: javax.servlet.http.HttpUpgradeHandler

Posted by Marek Jagielski <ma...@gmail.com>.
While debuging I see that

httpUpgradeHandlerClass in upgrade of org.apache.catalina.connector.Request
is
class org.apache.tomcat.websocket.server.WsHttpUpgradeHandler

InstanceManager is org.apache.catalina.core.DefaultInstanceManager

in the source code of my maven dependency of tomcat-api-7.0.47 this method
should exist:

public interface InstanceManager {

    public Object newInstance(Class<?> clazz)
            throws IllegalAccessException, InvocationTargetException,
NamingException,
                InstantiationException;
...

Any clue ?

Re: tomcat7-websocket - tomcat7-maven-plugin java.lang.ClassNotFoundException: javax.servlet.http.HttpUpgradeHandler

Posted by Marek Jagielski <ma...@gmail.com>.
I think I moved forward. I changed version of javaee-web-api from 6.0 to
7.0:
<dependency><groupId>javax</groupId><artifactId>javaee-
web-api</artifactId><version>6.0</version><scope>provided</
scope></dependency>
to:
<dependency><groupId>javax</groupId><artifactId>javaee-
web-api</artifactId><version>7.0</version><scope>provided</
scope></dependency>

However now I get an error on the server side:
SEVERE: Servlet.service() for servlet [default] in context with path []
threw exception [Filter execution threw an exception] with root cause
java.lang.NoSuchMethodError:
org.apache.tomcat.InstanceManager.newInstance(Ljava/lang/Class;)Ljava/lang/Object;
at org.apache.catalina.connector.Request.upgrade(Request.java:2850)
at
org.apache.catalina.connector.RequestFacade.upgrade(RequestFacade.java:1109)
at
org.apache.tomcat.websocket.server.UpgradeUtil.doUpgrade(UpgradeUtil.java:183)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:76)
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:502)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
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:724)



2013/11/7 Marek Jagielski <ma...@gmail.com>

> Hello,
> I am migrating my websocket application to the new API with version
> 7.0.47. How can correctly make a configuration of tomcat7-maven-plugin to
> use tomcat7-websocket on localhost.
> Here what I have in my pom:
> ...
> <dependencies>
>   ...
>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-catalina</artifactId></dependency>
>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-coyote</artifactId></dependency>
>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat7-websocket</artifactId></dependency>
> </dependencies>
>      ...
> </plugins>
>   <plugin>
>
> <groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId>
>                     <configuration>
>                         <url></url>
>                         <server></server>
>                         <path>/</path>
>                         <port>7443</port>
>                         <httpsPort>0</httpsPort>
>                         <keystorePass>catmot</keystorePass>
>
> <tomcatUsers>src/main/tomcatconf/tomcat-users.xml</tomcatUsers>
>                 </configuration>
>             </plugin>
>   </plugins>
>   </build>
> </project>
>
>
> and my parent pom:
> ...
> <dependencyManagement>
> ...
>   <dependencies>
>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-catalina</artifactId><version>7.0.47</version><scope>provided</scope></dependency>
>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-coyote</artifactId><version>7.0.47</version><scope>provided</scope></dependency>
>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat7-websocket</artifactId><version>7.0.47</version><scope>provided</scope></dependency>
>
> <dependency><groupId>javax</groupId><artifactId>javaee-web-api</artifactId><version>6.0</version><scope>provided</scope></dependency>
>   </dependencies>
> </dependencyManagement>
> ...
>
>   <pluginManagement>
>   <plugins>
>
> <plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version>
>  <dependencies>
>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-catalina</artifactId><version>7.0.47</version><scope>runtime</scope></dependency>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-coyote</artifactId><version>7.0.47</version><scope>runtime</scope></dependency>
> <dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat7-websocket</artifactId><version>7.0.47</version><scope>runtime</scope></dependency>
> </dependencies> </plugin>
>   </plugins>
>         </pluginManagement>
>   </build>
> </project>
>
>
> When using simple server end point
>
> @ServerEndpoint(value="/connector")
> public class MachineWsConnector {
>     @OnOpen
>     public void onOpen(Session session) { }
>
>   @OnClose
>   public void onClose(Session session, CloseReason closeReason) { }
> }
>
> and trying to connect with client with:
>
> WebSocketContainer container = ContainerProvider.getWebSocketContainer();
> container.connectToServer(Client.class, new
> URI("ws://localhost:7443/connector"));
>
> I get error on client side:
> Exception in thread "main" javax.websocket.DeploymentException: The HTTP
> response from the server [HTTP/1.1 500 Internal Server Error
> ] did not permit the HTTP upgrade to WebSocket
> at
> org.apache.tomcat.websocket.WsWebSocketContainer.parseStatus(WsWebSocketContainer.java:601)
> at
> org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:585)
>  at
> org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:317)
> at
> org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:183)
>  at
> org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:204)
> at com.systemincloud.api.machine.java.Client.main(Client.java:49)
>
> and on server side:
>
> java.lang.ClassNotFoundException: javax.servlet.http.HttpUpgradeHandler
> at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
>  at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
> at java.lang.ClassLoader.defineClass1(Native Method)
>  at java.lang.ClassLoader.defineClass(ClassLoader.java:788)
> at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
>  at
> org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2918)
> at
> org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1174)
>  at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669)
> at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
>  at
> org.apache.tomcat.websocket.server.UpgradeUtil.doUpgrade(UpgradeUtil.java:174)
> at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:76)
>  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:502)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
>  at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
> at
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
>  at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
>  at
> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
> at
> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
>  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:724)
>
> Thanks in advance,
>
> Marek
>
>
>


-- 
Marek Jagielski
+48 513 402 596