这不是做事的正确方式。资源应该添加到各个 EJB 的 本地 jndi 名称。这是为了将 bean 代码中使用的 jndi 名称与 bean 部署程序设置的 global jndi bindings 分开。 bean local jndi binding 和 global binding 的映射可以通过 ejb-jar.xml 和 appserver-specific 部署描述符来处理。
因此,您应该像这样声明您的@Resource(相当于<resource-ref> 元素,指示资源引用名称和类型):
@Resource(name = "jms/queue/aQueue")
private Queue queue;
然后,在特定于应用服务器的部署描述符中(对于 GlassFish,它是 sun-ejb-jar.xml,对于 JBoss,它是 jboss.xml,对于 WebLogic,它是 weblogic-ejb-jar.xml,等等),声明一个 <resource-ref> 元素,指示资源引用名称和通过 <jndi-name> 元素进行全局 jndi 绑定。
<resource-ref>
<res-ref-name>jms/queue/aQueue</res-ref-name>
<jndi-name>resource/foo/bar/ONE_QUEUE</jndi-name>
</resource-ref>
一旦你让整个事情工作起来,就可以很容易地使用 Maven 对这个特定于 appserver 的部署描述符进行变量化,以用于具有配置文件和过滤的不同环境。只需使用一个属性,激活资源过滤,并在配置文件中设置不同的值。类似的东西:
<resource-ref>
<res-ref-name>jms/queue/aQueue</res-ref-name>
<jndi-name>${my.jndi.name}</jndi-name>
</resource-ref>