亲爱的Stack Overflow Geeks,
我正在尝试使用JavaEE7创建一个非常基本的Java客户端-服务器应用程序,目的是使用JSR356实现通过websocket发送消息。
我已经根据我在那里发现的各种博客成功地对服务器进行了编程和部署,并且我能够将Javascript客户端与我的java服务器进行通信。
现在我要做的是创建一个独立的java应用程序,它需要与服务器通信并检索相同的信息。我读到JSR356实现可以在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实现(JSR356)相关的其他类,另一方面,我部署了服务器(web应用程序),websocket机制运行得很好。(我想我没有在那里实现CloseReason……但为什么它只抱怨这一点!:@)
如有任何帮助,我们将不胜感激!!
干杯,
另一个Stack Overflow极客寻求帮助。:)
我想说,只分析堆栈跟踪并给你一个"答案"是完全不可能的。至少您应该包含项目中的一些代码片段。
好吧,我认为可能的问题是:Tyrus库没有与应用程序客户端容器一起分发。然后在本地,类加载器想要加载的第一个类。。将失败。
因此,右键单击您的项目并选择属性。选择库。确保您的库已放在运行选项卡下。如果没有,请单击添加库按钮,然后按照步骤操作!
希望这对你有帮助。如果没有,请查看本教程,了解如何打包JavaFX客户端,并通过JavaWebStart启动它。本教程中的应用程序客户端也依赖于外部库,您可能会在其中找到一些有用的东西。