0

我已经放弃了 GlassFish 4-point-anything,转而支持 Payara41。令人惊讶的是,GF 有未解决的 JDBC 和 JMS 资源配置错误。请参阅: Glassfish 管理控制台在创建 JDBC 池时抛出 java.lang.IllegalStateException

Payara 完美修复了 JMS 配置问题。所以我需要的只是我的独立 Java 客户端需要获取 InitialContext(env) 来查找()这些资源的环境属性。

注意:InitalContext() 不能独立运行。仅在可以查找 {Payara Home}/glassfish/lib/jndi-properties 文件的 EJB 容器中。该文件有一个属性,所以这就是我在下面的代码中所拥有的:

键:“java.naming.factory.initial”

值:“com.sun.enterprise.naming.impl.SerialInitContextFactory”

这引发了一系列 NoClassDerfinitionFound 异常,导致我将这些带有这些类的 jar 添加到客户端的构建路径和 /glassfish/lib/。它们按照我遇到它们的顺序排列。

带有“com.sun.enterprise.naming.impl.SerialInitContextFactory”的“glassfish-naming.jar”

带有“org.glassfish.internal.api.Globals”的“internal-api-3.1.2.jar”

带有“org.glassfish.hk2.api.ServiceLocator”的“hk2-api-2.1.46.jar”

glassfish/lib 中的“appserv-rt.jar”添加到客户端构建路径

但是现在我的代码为 Globals.getDefaultHabitat() 抛出了 java.lang.NoSuchMethodError。请注意,下面的异常不会被我的 catch 块捕获。(而且我也没有在 Payara 的 service.log 中看到它。)

我知道我的客户找到了 Globals.class,因为添加它会导致 ServiceLocator 的 NoClassDefinitionFound。那里有两个“Globals.class”吗?一个有这个方法,一个没有那个方法。或者控制台输出中的“Lorg”真的与“org”不同,即是否有“Lorg/glassfish/hk2/api/ServiceLocator”?

我被困住了。这似乎是一种生计的需求——独立 Java 客户端需要获取 Payara 的 InitialContext 的环境属性——能够将它添加到这里供所有人使用会很好(除了我已经使用的 jars已经找到了。)我很想看到 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 资源时会抛出异常,我认为很多人会切换。

4

2 回答 2

1

JAR internal-api-3.1.2.jar 适用于 Glassfish v3,它的 Globals 类有一个方法 getDefaultHabitat() 返回 Habitat:

public static Habitat getDefaultHabitat() {
    return defaultHabitat;
}

但是,Glassfish v4 更改了方法签名,您必须使用新的 Glassfish v4 内部 API,其 Globals 类具有返回 ServiceLocator 的适当方法 getDefaultHabitat():

public static ServiceLocator getDefaultHabitat() {
    return defaultHabitat;
}

换句话说,将 internal-api-3.1.2.jar 替换为 internal-api-4.1.jar 可以在此处的 Maven Central 上找到

于 2015-10-14T08:04:01.983 回答
0

您应该添加${PAYARA-HOME}/glassfish/lib/gf-client.jar到您的类路径中,因为它引用了它的META-INF/MANIFEST.MF. 请注意,它使用相对路径引用,因此您确实需要在客户端计算机上安装 Payara。

于 2016-01-05T20:44:30.797 回答