我是Java EE的新手,所以这可能是一个虚拟问题。但我正在将一个包含EJB的WAR和JAR部署到Glassfish 3.1。服务器。 WAR引用了JAR文件中的一个EJB。是否必须将EJB JAR包含在WAR文件的lib
目录中才能使其工作?由于WAR和JAR都将在同一个应用服务器上运行,我希望我不需要处理这些依赖关系。但是,如果我没有包含EJB JAR,那么在部署WAR时我得到java.lang.NoClassDefFoundError
(即使EJB JAR已经部署在应用服务器上)。
答案 0 :(得分:4)
Java EE的一个基石是不同组件可以在不共享命名空间的容器中运行的概念,即使这些组件可能在同一个JVM中运行。如果您有需要共享命名空间的模块,则需要将它们捆绑到EAR中(在Java EE 6之前)或组合成单个WAR(由Java EE 6为需要利用EJB的Web应用程序建立的特殊情况) 。
这是熟悉Java SE开发人员“知道”的重大变化。对于大多数Java SE程序,容器是JVM进程。
因此,您的问题的答案是,“不。您不需要将EJB jar放在WAR文件的lib目录中。您可以创建一个包含BOTH档案的EAR文件。”
这可能会为你澄清情况......
myEar.ear
+ myEJBs.jar
+ myWAR.war
+ lib
+ a-jar-that-has-classes-used-in-both-archives-above.jar
答案 1 :(得分:1)
您是否尝试将WAR和JAR文件一起打包到EAR文件中? EAR文件可以有一个lib目录,您可以在其中放置要在企业应用程序的类路径FBO上加载的JAR文件。
这应解决您的类加载器问题。