Каковы свойства среды для Payara InitialContext от отдельно стоящего Java-клиента

Я отказался от GlassFish с 4 очками в пользу Payara41. Удивительно, но GF имеет неразрешенные ошибки конфигурации JDBC и JMS Resources. См.: Консоль администратора Glassfish выдает исключение java.lang.IllegalStateException при создании пула JDBC

Payara прекрасно исправила проблемы конфигурации JMS. Поэтому все, что мне нужно, - это свойства среды, в которых мой автономный Java-клиент должен получить InitialContext(env) для lookup() этих ресурсов.

Примечание: InitalContext() не работает в автономном режиме. Только в контейнере EJB, который может найти файл {Payara Home}/glassfish/lib/jndi-properties. Этот файл имеет одно свойство, вот что я имею в своем коде ниже:

Ключ: "java.naming.factory.initial"

Значение: "com.sun.enterprise.naming.impl.SerialInitContextFactory"

Это вызвало серию исключений NoClassDerfinitionFound, которые привели меня к добавлению этих jar-файлов с этими классами в путь сборки моего клиента и в / glassfish / lib /. Они в том порядке, в котором я с ними столкнулся.

"glassfish-naming.jar" с / com.sun.enterprise.naming.impl.SerialInitContextFactory "

"internal-api-3.1.2.jar" с / org.glassfish.internal.api.Globals "

"hk2-api-2.1.46.jar" с / org.glassfish.hk2.api.ServiceLocator "

"appserv-rt.jar" из glassfish / lib добавлен в путь сборки клиента

Но теперь мой код выдает java.lang.NoSuchMethodError для Globals.getDefaultHabitat(). Обратите внимание, что ниже исключения не попадает в мой блок catch. (И я не вижу его в service.log Payara тоже.)

Я знаю, что мой клиент находит Globals.class, потому что его добавление вызвало NoClassDefinitionFound для ServiceLocator. Есть ли там два "Globals.class"... один без и один без этого метода. Или "Lorg" в выводе консоли действительно отличается от "org", то есть есть "Lorg/glassfish/hk2/api/ServiceLocator"?

Я застрял. И это кажется такой сложной потребностью - свойства среды, необходимые автономному Java-клиенту для получения InitialContext в Payara, - было бы неплохо иметь возможность добавить его сюда для всех пользователей (в дополнение к банкам, которые я Я бы хотел увидеть взлет Payara, потому что мне нравится его консоль администратора по сравнению с ориентацией JBoss и MayFly на XML. Какие-либо предложения? Я в тупике. Код и вывод на консоль следующие:

Код

package org.america3.testclasses;

import java.util.Properties;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.america3.toolkit.U;

public class Test2 implements MessageListener {

  static final Properties JNDI_PROPERTIES = new Properties() {
    private static final long serialVersionUID = 1L;
    {/*This property key:vlaue pair is specified in Payara41/glassfish/lib/jndi-properties*/
     /*The class it calls for is in Payara41/glassfish/lib/glassfish-naming.jar*/
     this.put ("java.naming.factory.initial","com.sun.enterprise.naming.impl.SerialInitContextFactory");}
  };

  //constructor
  public Test2 () {
    String iAmM = U.getIAmMShort(Thread.currentThread().getStackTrace());
    System.out.println(iAmM + "beg");
    try {
      Context jndiContext = (Context) new InitialContext(JNDI_PROPERTIES);
    } catch (Exception e) {
      System.out.println("    " + iAmM + "InitialContext failed to instantiate");
      System.out.println("    " + iAmM + "Exception     : " + e.getClass().getName());
      System.out.println("    " + iAmM + "e.getMessage(): " + e.getMessage());
      System.out.println("    " + iAmM + "e.getMessage(): " + e.getCause());
      e.printStackTrace();
    }
    System.out.println(iAmM + "end");
  }

  public static void main(String[] args) {
    Test2 messageCenter = new Test2 ();
  }

  public void onMessage(Message arg0) {
    // TODO Auto-generated method stub

  }
}

Приставка

Test2.<init> ()                    beg
Exception in thread "main" java.lang.NoSuchMethodError: org.glassfish.internal.api.Globals.getDefaultHabitat()Lorg/glassfish/hk2/api/ServiceLocator;
    at com.sun.enterprise.naming.impl.SerialInitContextFactory.<init>(SerialInitContextFactory.java:126)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    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 org.america3.testclasses.Test2.<init>(Test2.java:24)
    at org.america3.testclasses.Test2.main(Test2.java:36)

PS: Может ли кто-то с достаточным количеством очков добавить тег "Paraya" ниже. Я имею в виду исключения консоли Glassfish при настройке любого JNDI или ресурса JMS. Я думаю, что многие люди переключатся.

2 ответа

JAR internal-api-3.1.2.jar предназначен для Glassfish v3, а его класс Globals имеет метод getDefaultHabitat(), который возвращает Habitat:

public static Habitat getDefaultHabitat() {
    return defaultHabitat;
}

Однако Glassfish v4 изменил сигнатуры методов, и вы должны использовать новый внутренний API Glassfish v4, класс Globals которого имеет соответствующий метод getDefaultHabitat(), который возвращает ServiceLocator:

public static ServiceLocator getDefaultHabitat() {
    return defaultHabitat;
}

Другими словами, замените internal-api-3.1.2.jar на internal-api-4.1.jar, который можно найти в Maven Central здесь

Вы должны добавить ${PAYARA-HOME}/glassfish/lib/gf-client.jar к вашему classpath, поскольку это ссылается на все другие необходимые банки в нем META-INF/MANIFEST.MF, Обратите внимание, что он использует относительные пути, поэтому вам действительно нужно установить Payara на клиентском компьютере.

Другие вопросы по тегам