3

到目前为止,我们一直在使用 WAS 6.1 来部署我们的 Web 应用程序。现在我们需要迁移到精通经济的 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 ......任何可行的解决方案对我来说都足够好。

任何人都可以帮忙吗?

4

2 回答 2

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 文件、连接器 .rar 文件和应用程序客户端 jar。在 Java EE 5 之前,必须在 application.xml 文件中明确列出库。Java EE 5 及更高版本可以将它们添加到 lib/ 目录中,并且可以理解为只是普通的 jar,而不是 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 中的类将永远不会成功加载。不幸的是,虚拟机几乎永远不会说出丢失的实际类,而是会报告导致需要丢失的类的事件链中的第一个类。这几乎总是一个 bean 或 servlet 类。

于 2010-10-14T11:02:13.683 回答
0

谢谢大卫。我尝试了以上所有方法,但仍然没有运气。我猜 Collapsed EAR 方法对我不起作用,据我所知 Tomcat 6.0.18 不符合 J2EE 6 规范。也许我错了,但我试过了,但还是没用。所以回到标准的 EAR 方法。

我的 EAR 完全按照您的第一个示例中的描述进行组织。一个 Ejb jar,/lib 中的两个库 jar,仅此而已。Tomcat 仍然无法实例化我的 EJB,因为 EJB 类与 Library Jar 2 中的一个无法访问的类相关。

我简化了我的 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>

还有什么想法吗??

于 2010-10-15T09:44:47.700 回答