Как настроить JNDI для Glassfish 3.1.2 для автономного клиента?

1

Я пытаюсь подключиться от автономного клиента swing (работающего в отдельной JVM на клиентской машине) к серверу Glassfish.

В настоящее время я использую следующие настройки из Netbeans, и все работает отлично:

System.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
System.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
System.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
System.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.3");
System.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext context = new InitialContext();

Но когда я пытаюсь запустить скомпилированный клиент с консоли, набрав "java -jar client.jar", я получаю следующую ошибку:

D:\workspace\gf-client\dist>java -jar gf-client.jar
17.08.2012 11:07:38 ch.client.core.ServerContext getInitialContext SCHWERWIEGEND: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
        at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
        at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.init(Unknown Source)
        at javax.naming.InitialContext.<init>(Unknown Source)
        at ch.lawsuite.core.ServerContext.getInitialContext(ServerContext.java:2 7)
        at ch.client.core.remote.Facades.initialize(Facades.java:68)
        at ch.client.core.Client.main(Client.java:57) Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialIni tContextFactory
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source)
        ... 7 more Exception in thread "main" java.lang.NullPointerException
        at ch.client.core.remote.Facades.initialize(Facades.java:69)
        at ch.client.core.Client.main(Client.java:57)

Кто-нибудь полезная идея?

  • Пропускает ли JVM какие-либо библиотеки? Какие? (он работает от netbeans, и все зависимые библиотеки упакованы в скомпилированный jar файл (по крайней мере, я так думаю..))
  • Существуют ли альтернативные последовательные фабрики контекста для Glassfish?

Большое спасибо за вашу помощь заранее!

  • 0
    Может быть, это может помочь вам: stackoverflow.com/questions/7804357/…
  • 0
    Я запускаю appclient из glassfish и, при необходимости, создаю скрипт для его запуска.
Теги:
java-ee-6
glassfish

3 ответа

0
Лучший ответ

Заглянув в файл MANIFEST.MF библиотеки gf-client.jar, я заметил, что на нем есть еще несколько других jar-libs. Чтобы запустить клиент за пределами платформы netbeans, мне пришлось скопировать все эти библиотеки в окончательную сборку собственного приложения. Тогда он работает отлично...: -)

  • 0
    а вы просто включаете эти jar-файлы в папку / lib с приложением?
  • 1
    нет, очень важно, чтобы структура всех этих рыбок из стеклянной рыбы сохранялась! поэтому вы должны добавить gf-client.jar в свои библиотеки относительно директории установки glassfish. это означает: оставьте gf-client.jar в glassfish / lib / gf-client.jar и просто укажите на этот jar из своего проекта. если вы хотите запустить свое приложение вне среды IDE (как автономной), убедитесь, что ссылка на папку Glassfish указана так же, как и раньше. если вам нужна дополнительная информация, дайте мне знать ...
Показать ещё 2 комментария
6

Точка для очистки интерфейсов удаленного EJB

Вам нужен интерфейс удаленного EJB, когда ваше клиентское приложение живет на одной JVM, отличной от той, где размещен модуль EJB. Другими словами:

  • Клиентское приложение работает на одной JVM, а модуль EJB развертывается на другой JVM на одном компьютере.

ИЛИ

  • Клиентское приложение работает на одной JVM, а модуль EJB развернут на другой JVM на удаленной машине.

Для простоты

Давайте рассмотрим первый сценарий, в котором как клиентское приложение, так и модуль EJB живут на разных JVM на той же машине.

  • Убедитесь, что на вашем компьютере установлено 2 JDK.
  • Разверните модуль EJB в установке Glassfish, указывая на один JDK (JVM). Мы можем согласиться установить Glassfish в "C:/glassfish3/"
  • В соответствии с документом в этой ссылке. Добавьте в клиентское приложение classpath файл "gf-client.jar" как внешнюю библиотеку из каталога установки (т.е. C:/glassfish3/glassfish/lib/gf-client.jar), а не скопируйте его.
  • Также добавьте в свой путь к классу клиентских приложений файл remote_interface.jar, который включает в себя удаленный бизнес-интерфейс вашего EJB.
  • Запустите клиентское приложение SE (автономное) на втором JDK (JVM)

Важный отзыв о клиенте

В соответствии с документацией автономные java-клиенты должны явно использовать глобальное имя JNDI для поиска удаленного EJB. Кроме того, Glassfish не требует каких-либо инициализации свойств для вызова конструктора InitialContext(). Таким образом, клиентское приложение может вызвать EJB, используя следующий фрагмент:

InitialContext context = new InitialContext();
_RemoteEjbInterface ejbBean = (_RemoteEjbInterface) context.lookup("java:global/DeployedEJBAppName/EjbImplClass!com.sam._RemoteEjbInterface");

В случае, если ваше клиентское приложение SE является автономным, вам необходимо

  • Учетная запись для вышеуказанного шага (3), добавив эту запись в приложение-клиент POM:

    <dependency>
        <groupId>org.glassfish.main.appclient.client</groupId>
        <artifactId>gf-client</artifactId>
        <version>3.1.2</version>
        <scope>system</scope>
        <systemPath>C:/glassfish3/glassfish/lib/gf-client.jar</systemPath>
    </dependency>
    
  • Учет этого шага (4) с помощью зависимости POM, указывающей на ваш remote_interface.jar в вашем локальном репозитории maven при условии, что вы его установили. Следуйте этому, чтобы узнать, как.

Ниже приведена другая документация для ссылки

  • 0
    глобальное имя JNDI изменяется в зависимости от того, развернут ли EAR на локальном хосте или на удаленном сервере? Я наивно ожидал бы, что EAR определит точное глобальное имя JNDI явно ...?
  • 0
    спас мою жизнь. 3 недели отладки.
0

Вам не хватает jar, содержащего класс com.sun.enterprise.naming.SerialInitialContextFactory в вашем пути к классам. Добавьте его в манифест вашей клиентской банки.

  • 1
    Я знаю, что этот класс находится в appserv-rt.jar, на который, в свою очередь, ссылается Manifest-файл gf-client.jar, который на самом деле находится в моем пути к классам. Как я могу сказать Netbeans включить библиотеки, на которые ссылается файл манифеста включенных библиотек?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню