我是Java EE的新手,所以也许这是一个虚拟的问题。但是我正在将一场战争和一个包含EJBs的罐子部署到Glassfish3.1。服务器。WAR引用了JAR文件中的一个Ejb。是否必须在WAR文件中包含EJB JAR lib 目录为了使这项工作?由于WAR和JAR都将在同一个应用服务器上运行,我希望我不需要处理这些依赖关系。但是,我得到了一个 java.lang.NoClassDefFoundError 当我部署WAR时,如果它不包括EJB JAR(即使EJB JAR已经部署在应用程序服务器上)。

有帮助吗?

解决方案

Java EE的基石之一是不同的组件可以在不共享命名空间的容器中运行,即使这些组件可能在同一个JVM中运行。如果您有需要共享命名空间的模块,则需要将它们捆绑到EAR中(在Java EE6之前)或组合到单个WAR中(Java EE6为需要利用Ejb的web应用程序建立的特例)。

这与熟悉Java SE开发的人"知道"的内容相比是一个重大变化。对于大多数Java SE程序,容器是JVM进程。

所以,你的问题的答案是,"不。您不需要将EJB jar放在WAR文件的lib目录中。您可以创建一个包含两个存档的EAR文件。"

这可能会为您澄清情况。..

 myEar.ear
   + myEJBs.jar
   + myWAR.war
   + lib
       + a-jar-that-has-classes-used-in-both-archives-above.jar

其他提示

您是否尝试过将WAR和JAR文件一起打包成EAR文件?EAR文件可以有一个lib目录,您可以将要加载的JAR文件放在企业应用程序的类路径FBO上。

这应该可以解决您的classloader问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top