问题是:如果我保持相同的 EAR、JAR、类和接口名称,这个名称总是相同的吗?或者它可以从应用服务器改变?
JNDI 名称在 Java EE 5 中没有标准化,并且会从一个应用服务器更改为另一个。Adam Bien 写了一篇很好的文章来说明这一点:
正如我在上一篇文章中提到的,Java EE 5 应用程序的可移植性比旧的 J2EE 1.4 世界要好得多。我发现了一个问题,这需要付出一些努力——缺乏定义和统一的 JNDI 命名和寻址。glassfish 应用程序服务器默认使用远程业务接口的
完全限定名称。JBoss 应用服务器使用以“/remote”结尾的 EJB 名称。所以下面的会话 Bean:
package com.abien;
@Stateless
public class HelloWorldBean implements HelloWorld {
public String sayHello(String hello){
return "Echo from server: ";
}
}
可以使用以下代码片段通过 JBoss(支持 EJB3)找到:
Context context = new InitialContext();
HelloWorld helloWorld = (HelloWorld) context.lookup("myEarName/HelloWorldBean/remote");
和 Glassfish(v1 和 v2),使用远程业务接口的完全限定名称:
Context context = new InitialContext();
HelloWorld helloWorld = (HelloWorld) context.lookup(HelloWorld.class.getName());
处理此问题的一种体面方法是使用ServiceLocator
“可插拔”应用程序服务器特定策略。看看ServiceLocator、JNDI Naming Helper 和 Java EE 5。
在 Java EE 6 中,事情得到了解决,我们终于有了Portable Global JNDI Names。