到目前为止,我们一直在使用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 ...任何有效的解决方案对我来说都足够了。
可能有人帮忙吗?
答案 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>
还有其他想法吗?