尝试使用jsr 356时出现java.lang.linkage错误



我正在尝试从部署在jetty中的war中实现jsr 356 websocket连接。

我将以此为指南:http://aredko.blogspot.com/2013/11/java-websockets-jsr-356-on-jetty-91.html

(我可以找到很多关于在嵌入式jetty服务器中基本上使用jsr 356的教程,但没有关于在现有服务器中构建websocket连接的教程——有什么好的吗?)

每当我运行上面列出的代码时,我都会得到以下错误:

java.lang.LinkageError: loader constraint violation: when resolving method "org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext(Lorg/eclipse/jetty/servlet/ServletContextHandler;)Lorg/eclipse/jetty/websocket/jsr356/server/ServerContainer;" the class loader (instance of org/eclipse/jetty/webapp/WebAppClassLoader) of the current class, com/me/stuff/data/DataServer, and the class loader (instance of org/eclipse/jetty/start/Classpath$Loader) for resolved class, org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer, have different Class objects for the type y.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext(Lorg/eclipse/jetty/servlet/ServletContextHandler;)Lorg/eclipse/jetty/websocket/jsr356/server/ServerContainer; used in the signature

指的是代码

ServerContainer container = WebSocketServerContainerInitializer.configureContext(context);

我不知道该怎么想。我使用gradle的以下行来引入websocket内容:

    providedCompile (
    [ group: 'javax.websocket', name: 'javax.websocket-api', version: '+'],
    [ group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '+' ]
    )
    compile (
    [ group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '+'],
    [ group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-client-impl', version: '+']
    )

我看到javax-websocket-server impl jar和javax.websocket-api jar都包含ServerContainer类。。。但我的战争档案中只包括其中一个。jetty是从其内部旧版本中提取的吗?还是我完全误读了问题的根源?

我的jetty版本是:jetty-9.2.1.v20140609

websocket jar不应该在您的WAR中。

从WAR的WEB-INF/lib/目录中删除以下jar。

  • javax.websocket-api-*.jar-javax.websocket API jar
  • javax-websocket-server-impl-*.jar-jetty服务器javax.websocket.server.*实现jar
  • javax-websocket-client-impl-jetty javax.websocket.*(客户端)jar

这是因为您正在针对javax.websocket.* API类进行编码/编译。

API和API的实现由Jetty自己提供。

这与使用servlet api进行代码编写时没有什么不同。(也就是说,在WAR中不包括servlet api和servlet api的实现)

相关内容

最新更新