部署多个2.1 EJB的OC4J 10.1.3.4问题
从OC4J 10.1.2.3迁移到10.1.3.1.4时遇到麻烦。问题出在具有多个EJB(所有都是2.1,没有EJB 3.0)的应用程序上。 Jdeveloper将采用默认的ejb-jar.xml(Jdeveloper在其独立的OC4J实例上运行它所必需的文件)并将其打包到每个EJB JAR模块中。这导致应用服务器在部署时钻入每个EJB JAR模块,并找到N次相同的ejb-jar.xml文件(其中N = EJB模块的数量)。这将导致重复的EJB引用,并且将中断所有JNDI查找,例如:" java:comp / env / ejb / EJBName"。因此,部署具有3个EJB,EJB1,EJB2和EJB3的应用程序会使应用程序服务器注册9个EJB而不是3个。我需要一种最佳实践方法,但是在10.1.3.4和JDeveloper起作用的情况之间,情况非常糟糕...
旁注:如果将Web应用程序的JNDI查找代码仅保留为" ejb / EJBName",则它们将起作用。但是,这是不可取的。
解决方案
我们应该查看Oracle文档,以了解哪种情况。
甲骨文? 《 J2EE Enterprise JavaBeans开发人员指南》的容器是一个好的开始
根据甲骨文? J2EE服务指南的容器,第2章:使用JNDI
当我们使用形式" ejb / EJBName"时,将执行"本地"查找。如果要使用完整表单,则必须选中"使用JNDI"一章的"启用全局JNDI查找"部分。
问题是我们的部署配置文件中有多个参考。我们为EACH EJB创建了一个部署概要文件。这意味着每个EJB都有自己的ejb-jar.xml(此文件包含项目中所有EJBS的描述)。因此,每次JDeveloper创建EJB时,它都会在生成的每个EJB中放置所有EJBS的描述符,从而导致NxN数量的引用。因此,Nx(N-1)个额外的引用。
现在,关键是Oracle Application Server 10.1.2.3.0和以下版本不再关心这些重复的引用。但是,正如我们所看到的,10.1.3.1.4是一个完全不同的版本,并且确实中断了。
我们的解决方案:仅具有1个EJB部署配置文件,其中包含所有EJB类和它们使用的POJO。记住,在每个EJB都有1个EJB Profile之前……所做的所有事情都是允许Jdeveloper(即IMHO)正确地生成有效的EAR。造成这种情况的原因是Jdeveloper和Oracle应用服务器的废话的结合。