18

在 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 查找!那么是否可以为 JNDI LookUps 配置应用程序和模块名称?

4

2 回答 2

18

天真的方法

Maven EAR 插件允许自定义模块文件名,您可以使用project.build.finalName.

更好的方法

分别覆盖 the<application-name>和 the<module-name>中的 theapplication.xml和 the ejb-jar.xml。在 EJB 3.1 中引用Portable Global JNDI 名称

除了上述名称之外,如果 EJB 只公开一个客户端视图(即它只实现一个接口或无接口视图),则容器还必须将 bean 映射到

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

在哪里

  1. <aplication-name>默认为.ear没有包扩展名的包名(文件名)。这可以在application.xml. 此外, <application-name>仅当 bean 打包在 .ear文件中时才适用。
  2. <module-name>默认为不带捆绑扩展名的捆绑名称(.war或)。.jar同样,这可以在ejb-jar.xml.
  3. <bean-name>默认为 bean 的非限定类名。但是,如果@Statefulor @Statelessor@Singleton使用 name 属性,那么此处指定的值将用作 bean 名称。
于 2010-08-07T20:39:47.603 回答
7

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

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

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

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

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

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

EE.8.1.1 组件创建

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

于 2011-08-15T15:07:06.153 回答