【问题标题】:Websocket client can not be deployed to GlassfishWebsocket 客户端无法部署到 Glassfish
【发布时间】:2013-08-21 23:15:14
【问题描述】:

尊敬的 Stack Overflow 极客们,

我正在尝试使用 Java EE 7 创建一个非常基本的 Java 客户端-服务器应用程序,其目的是使用 JSR 356 实现通过 websocket 发送消息。

我已经根据我在那里找到的各种博客成功地编程和部署了服务器,并且我能够与我的 java 服务器通信一个 Javascript 客户端。

现在我要做的是创建一个独立的 Java 应用程序,该应用程序需要与服务器通信并检索相同的信息。我读到 JSR 356 实现可以在 Java 客户端中使用,而这正是我所做的。我还使用 Tyrus 创建客户端并使用闩锁机制等保持其运行,等等等等。漂亮。客户端终于被编程,服务器启动并运行但是当我尝试运行客户端时我得到这个错误:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)
Caused by: java.lang.NoClassDefFoundError: javax/websocket/CloseReason$CloseCode
at Main.Main.main(Main.java:27)
... 6 more
Caused by: java.lang.ClassNotFoundException: javax.websocket.CloseReason$CloseCode
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at org.glassfish.appclient.client.acc.ACCClassLoader.findClass(ACCClassLoader.java:237)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 7 more
Java Result: 1

我在 NetBeans 7.3 中使用 Java EE 7 API + Tyrus 并在 Glassfish 4 中进行部署(据我所知,它支持 JSR 356 实现) 现在,到底为什么找不到 CloseReason 类! :( 如果是这样,它就不应该编译,不是吗?

奇怪的是,它没有抱怨与 websocket 实现(JSR 356)相关的其他类,另一方面,我部署了服务器(web-app)并且 websocket 机制工作得很好。 (我想我没有在那里实现 CloseReason .. 但为什么它只抱怨这个!:@)

我们将非常感谢您提供的任何帮助!!

干杯,

另一个寻求帮助的 Stack Overflow Geek。 :)

【问题讨论】:

    标签: java websocket glassfish-4 java-ee-7 tyrus


    【解决方案1】:

    我想说只分析堆栈跟踪并给你一个“答案”是完全不可能的。至少你应该从你的项目中包含一些代码 sn-ps。

    好的,我认为问题可能是这样的:Tyrus 库没有与应用程序客户端容器一起分发。然后在本地,类加载器要加载的第一个类..将失败。

    因此,右键单击您的项目并选择属性。选择。确保您的库已放在 Run 选项卡下方。如果没有,请单击您在此选项卡中找到的 添加库... 按钮并按照步骤操作!

    希望这对您有所帮助。如果没有,请查看this 教程,了解如何打包 JavaFX 客户端并让他通过 Java Web Start 启动。本教程中的应用程序客户端也依赖于外部库,您可能会在其中找到一些有用的东西。

    【讨论】:

    • 谢谢马丁的回答!现在,我将 Tyrus 库添加到了“运行”选项卡,但它也不起作用。请注意,Tyrus 已经添加到 Compile 选项卡中,并且在 Run 选项卡中显示:Compiled Sources,这意味着(我相信)它已经将它们考虑在内。奇怪的是,CloseReason 不是类加载器应该加载的第一个类,因为我之前已经实例化了其他 websocket 类,例如 Session、EndpointConfig 等。这并不是对我说:我找不到这些类。在编译时它工作得很好,但是当我运行时,类加载器会抱怨。
    • 应用程序客户端容器在分发客户端存根时应包含 Websocket API。除非您的应用程序使用 Tyrus 的特定实现 API,否则无需打包 Tyrus JAR。
    猜你喜欢
    • 2019-09-22
    • 1970-01-01
    • 2017-01-25
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2013-12-09
    • 2017-04-08
    相关资源
    最近更新 更多