Deployment OpenEJB上的EJB2.0-我应该将所需的JAR放在哪里?

Deployment OpenEJB上的EJB2.0-我应该将所需的JAR放在哪里?,deployment,tomcat6,ejb-2.x,openejb,Deployment,Tomcat6,Ejb 2.x,Openejb,到目前为止,我们一直在使用WAS6.1部署我们的web应用程序。现在我们需要迁移到精通经济学的Tomcat+OpenEJB解决方案。OpenEJB 3.1.2容器插入Tomcat 6.18,这里没有独立的OpenEJB服务器 所以我在这里,试图将EJB2.1对象部署到OpenEJB中 我的问题是EJB代码需要外部的.jar库,我不知道应该将它们放在哪里,以便在容器的类路径中考虑它们。它在catalina.home/lib中运行良好,在openejb.home/lib中也是如此。但是,我还是希望找

到目前为止,我们一直在使用WAS6.1部署我们的web应用程序。现在我们需要迁移到精通经济学的Tomcat+OpenEJB解决方案。OpenEJB 3.1.2容器插入Tomcat 6.18,这里没有独立的OpenEJB服务器

所以我在这里,试图将EJB2.1对象部署到OpenEJB中

我的问题是EJB代码需要外部的.jar库,我不知道应该将它们放在哪里,以便在容器的类路径中考虑它们。它在catalina.home/lib中运行良好,在openejb.home/lib中也是如此。但是,我还是希望找到一种方法来打包EJB,这样它们就可以很容易地通过链接的.jar部署到OpenEJB容器使用的位置

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


有人能帮忙吗?

Ear方法

您只需将它放到Tomcat webapps/目录中,它就会被选中

示例ear(有效):

常见错误(无效):

根目录中只允许使用JavaEE模块。这些是EJBJAR、.war文件、Connector.rar文件和应用程序客户端JAR。在JavaEE5之前,库必须显式地列在application.xml文件中。JavaEE5和forward可以将它们添加到lib/目录中,并理解为与JavaEE模块相反的普通JAR

收拢耳进近

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

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类。

谢谢David。 我尝试了以上所有方法,但仍然没有成功。 据我所知,Tomcat6.0.18不符合J2EE6规范,我想这种折叠的EAR方法对我不起作用。也许我错了,但我试过了,但还是没有成功。所以回到标准的耳道方法

我的耳朵完全按照您第一个示例中的描述组织。一个Ejb jar,两个库jar在/lib中,就是这样。Tomcat仍然无法实例化我的EJB,因为EJB类与库JAR2中无法访问的类相关

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

ProxyaEAR
ProxyaEJB.jar

还有其他想法吗?

我认为tomcat_home/lib是避免类加载器问题的方法。请看@JoseK,我认为这个问题与在webapp中包含javax库有关。其中大多数是通过OpenEJB附带的JavaEEAPI jar添加的。其他第三方LIB也可以。如果你有其他经验,一定要告诉我。不,不行。。。我的EJB依赖于另一个.jar中的类。我试着‘不’试着把.jar放到几个地方,但没有成功:在.ear的根目录下,.war的根目录下,.war的WEB-INF/lib文件夹中。。。当我启动Tomcat服务器时,我一直有“java.lang.NoClassDefFoundError:无法完全加载类:eu.partecis.proxya.ejb.autorisation.UcAutorisationBean”,原因是:类加载器:(yadayada)中的EvtAutorisationRechercheBean异常。将第三方libs放在ear或war的根上是无效的。如果EJBJAR位于同一个WEB-INF/lib目录中,WEB-INF/lib应该可以工作。将扩展答案,以显示一些假设的示例。如果你能把问题扩展到所有你正在使用的JAR,那就太好了。如果您有一个描述符,那么您必须使用myLibrary.jar为每个第三方库显式列出所有jar。
tomcat/lib/libraryTwo.jar

mywebapp.war
  WEB-INF/lib/libraryOne.jar
  WEB-INF/lib/redEjbs.jar
  WEB-INF/lib/blueEjbs.jar
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ...>
<application>
  <display-name>ProxyaEAR</display-name>
  <module id="EjbModule">
     <ejb>ProxyaEJB.jar</ejb>
  </module>
</application>