Клиент Websocket не может быть развернут в Glassfish

Уважаемые знатоки переполнения стека!

Я пытаюсь создать очень простое клиент-серверное приложение Java с использованием Java EE 7, и намерение состоит в том, чтобы отправить сообщение через веб-сокет с использованием реализации JSR 356.

Я запрограммировал и успешно развернул сервер, следуя различным блогам, которые я там нашел, и мне удалось связаться с клиентом Javascript с моим сервером Java.

Теперь я пытаюсь создать отдельное 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

Я использую Java EE 7 API + Tyrus в NetBeans 7.3 и развертываю в Glassfish 4 (который, насколько я читал, поддерживает реализацию JSR 356). Теперь, с какой стати не находит класс CloseReason! :( В таком случае он не должен был скомпилироваться, не так ли?

Странно то, что я не жалуюсь на другие классы, связанные с реализацией веб-сокета (JSR 356), и, с другой стороны, я развернул сервер (веб-приложение), и механизм веб-сокета работает нормально. (Я думаю, что я не реализовал там CloseReason... но почему он жалуется только на это! :@)

Любая оказанная помощь будет высоко оценена!!

Ваше здоровье,

Еще один выродок Stack Overflow ищет помощи. :)


person cSn    schedule 21.08.2013    source источник


Ответы (1)


Я бы сказал, что совершенно невозможно просто проанализировать эту трассировку стека и дать вам «ответ». По крайней мере, вы должны включить некоторые фрагменты кода из своего проекта.

Хорошо, я думаю, что проблема может заключаться в следующем: библиотеки Tyrus не распространяются с контейнером клиента приложения. Тогда локально первый класс, который загрузчик классов хочет загрузить... не удастся.

Итак, щелкните проект правой кнопкой мыши и выберите Свойства. Выберите Библиотеки. Убедитесь, что ваша библиотека находится на вкладке Выполнить. Если нет, нажмите кнопку Добавить библиотеку... на этой вкладке и следуйте процедуре!

Надеюсь, это помогло вам. Если нет, просмотрите этот учебник о том, как для упаковки клиента JavaFX и его запуска через Java Web Start. Клиент приложения в этом руководстве также зависит от внешних библиотек, и вы можете найти там что-то полезное.

person Martin Andersson    schedule 22.08.2013
comment
Спасибо Мартин за ответ! Теперь я добавил библиотеку Tyrus на вкладку «Выполнить», но это тоже не сработало. Обратите внимание, что Tyrus уже добавлен на вкладке «Компиляция», а на вкладке «Выполнить» написано: «Скомпилированные источники», что означает (я полагаю), что он уже принимает их во внимание. Странно то, что CloseReason не является первым классом, который должен загрузить загрузчик классов, потому что я уже создавал экземпляры других классов веб-сокетов, таких как Session, EndpointConfig и т. д. И это не говорит мне: я не мог найти эти классы. Во время компиляции он работает отлично, но когда я запускаю, загрузчик классов жалуется. - person cSn; 22.08.2013
comment
Контейнер клиента приложения должен включать API Websocket при распространении клиентских заглушек. Если ваше приложение не использует специфичные для реализации API от Tyrus, нет необходимости упаковывать Tyrus JAR. - person Ian Evans; 22.08.2013