Java 如何在编译时为资源注释指定名称?

Java 如何在编译时为资源注释指定名称?,java,ejb-3.0,Java,Ejb 3.0,我们的代码是这样的: @Resource(name = "java:comp/resource/foo/bar/ONE_QUEUE") private Queue queue; @Resource(name = "java:comp/resource/foo/bar/SECOND_QUEUE") private Queue queue; @Resource(name = "jms/queue/aQueue") private Queue queue; 但是,在一种部署场景中,队列注释应如下

我们的代码是这样的:

@Resource(name = "java:comp/resource/foo/bar/ONE_QUEUE")
private Queue queue;
@Resource(name = "java:comp/resource/foo/bar/SECOND_QUEUE")
private Queue queue;
@Resource(name = "jms/queue/aQueue")
private Queue queue;
但是,在一种部署场景中,队列注释应如下所示:

@Resource(name = "java:comp/resource/foo/bar/ONE_QUEUE")
private Queue queue;
@Resource(name = "java:comp/resource/foo/bar/SECOND_QUEUE")
private Queue queue;
@Resource(name = "jms/queue/aQueue")
private Queue queue;
我想选择用于Maven构建概要文件的名称


我有什么选择?

我认为你可以使用maven过滤,尽管这会让人觉得很奇怪


这是一篇关于这种方法的文章。

这不是正确的做法。应将资源添加到各个EJB的本地jndi名称中。这是为了将bean代码中使用的jndi名称与bean部署人员设置的全局jndi绑定分开。bean本地jndi绑定和全局绑定的映射可以通过
ejb jar.xml
和特定于appserver的部署描述符来处理

因此,您应该声明
@Resource
(相当于指示资源引用名称和类型的
元素),如下所示:

@Resource(name = "java:comp/resource/foo/bar/ONE_QUEUE")
private Queue queue;
@Resource(name = "java:comp/resource/foo/bar/SECOND_QUEUE")
private Queue queue;
@Resource(name = "jms/queue/aQueue")
private Queue queue;
然后,在特定于appserver的部署描述符中(对于GlassFish,它是
sun ejb jar.xml
,对于JBoss,它是
JBoss.xml
,对于WebLogic,它是
WebLogic ejb jar.xml
,等等),声明一个
元素,通过
元素指示资源引用名称和全局jndi绑定

<resource-ref>
  <res-ref-name>jms/queue/aQueue</res-ref-name>
  <jndi-name>resource/foo/bar/ONE_QUEUE</jndi-name>
</resource-ref>

jms/queue/aQueue
资源/foo/bar/ONE_队列
一旦整个工作正常,就可以很容易地在不同的环境中使用Maven对这个特定于appserver的部署描述符进行变量化,包括概要文件和筛选。只需使用属性,激活资源筛选,并在配置文件中设置不同的值。诸如此类:

<resource-ref>
  <res-ref-name>jms/queue/aQueue</res-ref-name>
  <jndi-name>${my.jndi.name}</jndi-name>
</resource-ref>

jms/queue/aQueue
${my.jndi.name}

如果不想按bean配置,可以使用JBoss Seam功能(请参阅)。我不知道这是否是Java依赖注入规范(JSR-299)的一部分(如果您担心供应商的独立性)

编辑:显然它是JSR-299的一部分,参见