OpenEJB上的EJB 2.0 - 我在哪里放置所需的罐子?

时间:2010-10-14 07:58:03

标签: deployment tomcat6 ejb-2.x openejb

到目前为止,我们一直在使用WAS 6.1来部署我们的网络应用程序。现在我们需要迁移到经济学家熟悉的Tomcat + OpenEJB解决方案。 OpenEJB 3.1.2容器插入Tomcat 6.18,这里没有独立的OpenEJB服务器。

所以我在这里尝试将EJB 2.1对象部署到OpenEJB ...

我的问题是EJB代码需要外部.jar库,我不知道在哪里放置它们以便它们实际上被考虑到容器的类路径中。它适用于catalina.home / lib,因此它可以用于openejb.home / lib。但是我仍然宁愿找到一种方法来打包EJB,以便它们易于部署,并将链接的.jar直接放到适当位置以供OpenEJB容器使用。

它可以包括使用正确的描述符文件构建.ear或.jar ...任何有效的解决方案对我来说都足够了。

可能有人帮忙吗?

2 个答案:

答案 0 :(得分:4)

耳朵方法

您可以将其放入Tomcat webapps /目录中,然后将其选中。

示例耳(有效):

myapplication.ear
  lib/
  lib/libraryOne.jar
  lib/libraryTwo.jar
  redEjbs.jar
  blueEjbs.jar

常见错误(无效):

myapplication.ear
  libraryOne.jar  (err. not a javaee module)
  libraryTwo.jar  (err. not a javaee module)
  redEjbs.jar
  blueEjbs.jar

根目录中只允许使用Java EE模块。这些是EJB jar,.war文件,Connector .rar文件和Application Client jar。在Java EE 5之前,必须在application.xml文件中明确列出库。 Java EE 5和转发它们可以添加到lib /目录中,并且可以理解为纯Java而不是Java EE模块。

折叠的EAR方法

在OpenEJB / Tomcat中,您可以将所有库放入war文件中,并且不受耳朵概念的影响。这是Java EE 6的一部分。

mywebapp.war
  WEB-INF/lib/libraryOne.jar
  WEB-INF/lib/libraryTwo.jar
  WEB-INF/lib/redEjbs.jar
  WEB-INF/lib/blueEjbs.jar

常见错误,包括规格:

mywebapp.war
  WEB-INF/lib/javax.ejb.jar   (err. clashes with the related system library)
  WEB-INF/lib/libraryOne.jar
  WEB-INF/lib/libraryTwo.jar
  WEB-INF/lib/redEjbs.jar
  WEB-INF/lib/blueEjbs.jar

这听起来不是问题,而是添加完整性。

常见错误,依赖性破坏:

tomcat/lib/libraryTwo.jar

mywebapp.war
  WEB-INF/lib/libraryOne.jar
  WEB-INF/lib/redEjbs.jar
  WEB-INF/lib/blueEjbs.jar

从规范角度来看,上述内容并非无效,服务器无法检测,但仍可导致应用无法正确加载。如果libraryTwo.jar需要libraryOne.jar中的类,则此应用程序将永远不会工作,因为Tomcat“lib”类加载器无法从“webapp”类加载器中看到类,因此libraryTwo.jar中的类将永远不会成功加载。不幸的是,vm几乎不会说实际缺少的类,而是报告导致需要缺少类的事件链中的第一个类。这几乎总是一个bean或servlet类。

答案 1 :(得分:0)

谢谢大卫。 我尝试了以上所有,但仍然没有运气。 我认为,崩溃的EAR方法对我来说不起作用,因为据我所知,Tomcat 6.0.18不符合J2EE 6规范。也许我错了,但我尝试过,但无论如何都没有用。所以回到标准的EAR方法。

我的EAR的组织完全如您的第一个示例中所述。一个Ejb jar,/ lib中的两个库jar,就是这样。 Tomcat仍然无法实现我的EJB,因为EJB类与Library Jar Two中一个无法访问的类相关。

我简化了我的application.xml文件,因此它只声明了一个EJB:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ...>
<application>
  <display-name>ProxyaEAR</display-name>
  <module id="EjbModule">
     <ejb>ProxyaEJB.jar</ejb>
  </module>
</application>

还有其他想法吗?