JEE6全局JNDI名称和Maven部署

时间:2010-05-10 16:22:24

标签: maven-2 ejb-3.0 jndi

我的EJB资源的全局JNDI名称存在一些问题,这些问题(或者至少会)导致我的JNDI查找失败。该项目正在Netbeans上开发,是一个标准的Maven Web应用程序。当我的应用程序部署到GF3.0时,应用程序名称设置为:

com.example_myapp_war_1.0-SNAPSHOT

从Netbeans的角度来看,这一切都很好,因为它确保名称是唯一的,但它也意味着所有的EJB都获得如下全局名称:

的java:全球/ com.example_myapp_war_1.0-SNAPSHOT /的CustomerService

这当然会导致问题,因为每次版本更改时,所有全局名称都会发生变化(我通过更改版本测试了这一点,并确实更改了名称)。该名称是从POM文件生成的,它是以下的串联:

<groupId>com.example</groupId>
<artifactId>myapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>

到目前为止,我已经离开了使用@EJB注入所有资源,但现在我需要从JSF Converter访问CustomerService EJB,所以我正在做一个像这样的JNDI:

try {
    Context ctx = new InitialContext();
    CustomerService customerService = (CustomerService)ctx.lookup( "java:global/com.example_myapp_war_1.0-SNAPSHOT/CustomerService" );
    return customerService.get(submittedValue);
} catch( Exception e ) {
    logger.error( "Failed to convert customer.", e );
    return null;
}
当应用程序正确发布并且模块名称发生变化时,

会明显中断。所以,百万美元的问题:如何在maven中设置模型名称或如何恢复module name以便我可以以编程方式在runtile上构建JNDI名称。我已尝试按照该链接的建议在web.xml文件中设置它,但它被忽略了。我认为我宁愿在运行时建立名称,因为这意味着在部署应用程序时,螺丝钉的范围会更小。

非常感谢你的帮助,我一直在整理我的头发。

2 个答案:

答案 0 :(得分:3)

如果EJB包含在WAR中,只需使用java:module别名:

java:module/CustomerService

答案 1 :(得分:0)

  

如何在maven中设置模块名称或如何恢复模块名称,以便我可以在运行时以编程方式构建JNDI名称。

好吧,正如提供的链接中所写,关于EJB 3.1中可移植全局JNDI名称的module-name

  

<module-name> 默认使用包名称(.war或.jar)而不使用包扩展名。

所以我会配置Maven并将finalName设置为不包含WAR名称中的版本:

<project>
  ...
  <build>
    <finalName>${artifactId}</finalName>
    ...
  </build>
</project>

在GlassFish上部署时,不确定为什么NetBeans包含软件包名称和下划线(NetBeans正在这样做,对吧?),如果可以避免NB这样做。