我放弃了GlassFish 4分 - 支持Payara41的任何东西。令人惊讶的是GF没有解决JDBC和JMS资源配置错误。看到: Glassfish Admin Console throws java.lang.IllegalStateException when creating JDBC Pool
Payara完美修复了JMS配置问题。所以我需要的是我的独立Java客户端需要获取InitialContext(env)来查找()那些资源的环境属性。
注意:InitalContext()不能独立运行。仅在可以查找{Payara Home} / glassfish / lib / jndi-properties文件的EJB容器中。该文件有一个属性,这就是我在下面的代码中所拥有的:
密钥:“java.naming.factory.initial”
价值:“com.sun.enterprise.naming.impl.SerialInitContextFactory”
这引发了一系列NoClassDerfinitionFound Exceptions,这些异常导致我将这些类添加到我的客户端的构建路径和/ glassfish / lib /中。它们按我遇到的顺序排列。
“glassfish-naming.jar”w /“com.sun.enterprise.naming.impl.SerialInitContextFactory”
“internal-api-3.1.2.jar”w /“org.glassfish.internal.api.Globals”
“hk2-api-2.1.46.jar”w /“org.glassfish.hk2.api.ServiceLocator”
来自glassfish / lib的“appserv-rt.jar”添加到客户端构建路径但是现在我的代码为Globals.getDefaultHabitat()抛出了一个java.lang.NoSuchMethodError。请注意,下面的异常不会被我的catch块捕获。 (我也没有在Payara的service.log中看到它。)
我知道我的客户端找到了Globals.class,因为添加它会导致ServiceLocator的NoClassDefinitionFound。那里有两个“Globals.class”......一个w /和一个w / o那个方法。或者控制台输出中的“Lorg”与“org”真的不同,即是否有“Lorg / glassfish / hk2 / api / ServiceLocator”?
我被困住了。这似乎是一种面包和黄油的需求 - 独立的Java客户端需要获得Payara的InitialContext的环境属性 - 能够在这里添加它以供所有人使用(除了罐子之外我很高兴)已经找到了。)我很想看到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资源时抛出异常我认为很多人会切换。
答案 0 :(得分: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替换为可在Maven Central here上找到的internal-api-4.1.jar
答案 1 :(得分:0)
您应该将${PAYARA-HOME}/glassfish/lib/gf-client.jar
添加到您的类路径中,因为它会引用其中META-INF/MANIFEST.MF
中所有其他必需的jar。请注意,它使用相对路径引用,因此您确实需要在客户端计算机上安装Payara。