如何为JNDI Lookup配置模块和应用程序名称

时间:2010-08-07 17:24:10

标签: maven-2 java-ee glassfish jndi java-ee-6

在EJB 3.1中,可以使用不同的查找名称进行JNDI查找:

java:global[/<app-name>]/<module-name>/<bean-name>!<fully-qualifiedbean interface-name>           
java:global[/<app-name>]/<module-name>/<bean-name> 
java:app/<module-name>/<bean-name>!<fully-qualified-bean-interface-name> 
java:app/<module-name>/<bean-name> 
java:module/<bean-name>!<fully-qualified-bean-interface-name> 
java:module/<bean-name>

在我的JavaEE 6项目中(使用Maven 2,Netbeans 6和Glassfish v3),应用程序名称为X-Snapshot.ear,EJB-Module为Y-Snapshot.jar。如何配置此maven项目以使用其他应用程序和模块名称?当这个名字改变时,我不想改变所有的JNDI Lookup!那么可以为JNDI LookUps配置应用程序和模块名称吗?

2 个答案:

答案 0 :(得分:17)

天真的方法

Maven EAR插件允许Customize A Module Filename,您可以使用project.build.finalName设置最终名称或EAR。

更好的方法

分别覆盖<application-name><module-name>中的application.xmlejb-jar.xml。引用Portable Global JNDI name in EJB 3.1

  

除了以上名称,如果   EJB只公开一个客户端视图   (即它只实现了一个   接口或无接口视图),   容器也被强制映射   豆到

java:global/[<application-name>]/<module-name>/<bean-name>
     

其中

     
      
  1. <aplication-name>默认为捆绑名称(.ear文件名)   捆绑扩展。这可以   在application.xml中被覆盖。也,   <application-name>适用   只有当bean被包装在一个   .ear档案。
  2.   
  3. <module-name>默认为捆绑名称(.war.jar),而不是   捆绑扩展。再次,这可以   在ejb-jar.xml中被覆盖。
  4.   
  5. <bean-name>默认为bean的非限定类名。   但是,如果@Stateful或   @Stateless@Singleton使用。{   name属性,然后是值   指定将用作   豆名。
  6.   

答案 1 :(得分:6)

可以在运行时通过JNDI查找应用程序名称和模块名称:

@Resource(lookup = "java:app/AppName")
private String appName;

@Resource(lookup = "java:module/ModuleName")
private String moduleName;

虽然您可以在应用程序部署描述符as described中配置application-name和module-name,但仍可在部署时覆盖这些名称(按照Java EE specification,如下所示),因此,最好不要在应用程序代码中对这些值进行硬编码。

  

EE.8.5.2部署Java EE应用程序 EE.8.5.1部署独立的Java EE模块

     

部署工具必须确保应用程序名称在应用程序服务器实例中是唯一的。如果名称不是唯一的,则部署工具可以自动选择唯一名称或允许Deployer选择唯一名称

     

EE.8.1.1组件创建

     

当且仅当名称不唯一时(例如,因为在删除不同的文件扩展名后两个名称相同),部署工具可以为任何冲突模块选择新的唯一名称;不得更改不冲突的模块名称。在这种情况下选择唯一名称的算法是特定于产品的。