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

Mic*_* W. 16 maven-2 jndi glassfish java-ee java-ee-6

在EJB 3.1中,JNDI Lookup可以使用不同的Lookup-Names:

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>
Run Code Online (Sandbox Code Playgroud)

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

Pas*_*ent 17

天真的方法

Maven EAR插件允许自定义模块文件名,您可以使用设置最终名称或EAR project.build.finalName.

更好的方法

分别覆盖<application-name><module-name>application.xmlejb-jar.xml.在EJB 3.1中引用可移植全局JNDI名称:

除了上面的名称,如果EJB只公开一个客户端视图(即它只实现一个接口或没有接口视图),那么容器也被强制将bean映射到

java:global/[<application-name>]/<module-name>/<bean-name>
Run Code Online (Sandbox Code Playgroud)

哪里

  1. <aplication-name>默认为.ear没有包扩展名的包名称(文件名).这可以被覆盖application.xml.此外, <application-name>仅当bean打包在.ear文件中时才适用 .
  2. <module-name>默认为捆绑名称(.war.jar)没有捆绑扩展名.同样,这可以被覆盖ejb-jar.xml.
  3. <bean-name>默认为bean的非限定类名.然而,如果@Stateful还是 @Stateless@Singleton使用name属性,则该值规定有将用作bean的名称.


she*_*ley 6

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

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

@Resource(lookup = "java:module/ModuleName")
private String moduleName;
Run Code Online (Sandbox Code Playgroud)

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

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

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

EE.8.1.1组件创建

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