Deployment GlassFishV3:Web应用程序在同一个环境中找不到JAR

Deployment GlassFishV3:Web应用程序在同一个环境中找不到JAR,deployment,glassfish-3,Deployment,Glassfish 3,我在Eclipse中创建了一个EAR应用程序,以在Glassfish 3.1中运行。使用的项目有:Bibliotecear2主EAR“Biblioteca”是指“Library”、带有EJB的BibliotecaEJB、带有实体和DAO的BibliotecaModel以及Web应用程序的BibliotecaWeb。application.xml具有以下结构: <?xml version="1.0" encoding="UTF-8"?> <application xmlns:xs

我在Eclipse中创建了一个EAR应用程序,以在Glassfish 3.1中运行。使用的项目有:Bibliotecear2主EAR“Biblioteca”是指“Library”、带有EJB的BibliotecaEJB、带有实体和DAO的BibliotecaModel以及Web应用程序的BibliotecaWeb。application.xml具有以下结构:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" id="Application_ID" version="6">
  <display-name>BibliotecaEAR2</display-name>
  <module>
    <web>
      <web-uri>BibliotecaWeb.war</web-uri>
      <context-root>biblioteca</context-root>
    </web>
  </module>
  <module>
    <ejb>BibliotecaEJB.jar</ejb>
  </module>
</application>
启动glassfish时,我收到以下警告信息:

2014-10-20T14:34:31.691-0200|WARNING: PWC6351: In TLD scanning, the supplied resource file:/C:/dev/glassfish3/glassfish/domains/biblioteca-glass3/eclipseApps/BibliotecaEAR2/BibliotecaEJB.jar does not exist
java.io.FileNotFoundException: C:\dev\glassfish3\glassfish\domains\biblioteca-glass3\eclipseApps\BibliotecaEAR2\BibliotecaEJB.jar (O sistema nao pode encontrar o arquivo especificado)
虽然它不会阻止我运行应用程序,但我想消除它

通过谷歌搜索PWC6351警告,我发现当在清单文件中找不到使用过的JAR时,就会发生这种情况。然而,请求JAR不仅仅是一个外部库,而是同一EAR中的一个子项目。我是否应该进行其他配置

谢谢

拉斐尔·阿方索来自:

在EAR文件中打包应用程序时,库JAR需要 放在存档根目录级别的存档库目录JAR中 未添加到类路径,因此可从其他EAR获得 人工制品

库JAR放在EAR的/lib目录中 目录名可以在application.xml中重写。xml将可见 到所有子模块JAR、WAR和RAR,无需进一步 配置无需在EAR清单中添加类路径项

事实上,您不需要引用lib文件夹中的jar,而且如果您引用EAR root级别的jar(如BibliotecaEJB.jar),它看起来将不起作用

如果WAR模块类与EJB模块类之间没有真正的依赖关系,那么只需从MANIFEST.MF中删除所有条目,它就可以工作了

如果您有一个真正的从WAR到EJB的依赖关系,那么您可能需要考虑您的项目结构,以及您是否真的需要EAR。你也可以把所有的东西打包成一场战争

如果您当前的WAR类直接依赖于EJB模块中的类,那么在WAR和EJB模块中使用EAR的正确方法需要一些工作:

一,。台阶

您必须为所有服务类创建接口,这些服务类应可用于web应用程序中的类

下面是一个简单的例子:

public interface FileService {

   public void showFileInformation(File file);
}

二,。台阶

下一步是将所有新接口打包到一个新jar中。您的模型jar看起来与此方法类似。如果这不能用于此目的,那么创建一个简单的java应用程序项目,将其打包为jar,并将所有接口放入该项目中。这个jar必须位于EAR的lib文件夹中

BibliotecaEAR2
     -- BibliotecaEJB
     -- BibliotecaWeb
     -- /lib/interfaces.jar
然后,您必须在WAR和EJB模块中向这个新jar添加依赖项,以便它们能够找到接口类

三,。台阶

这些服务可以注入web应用程序的托管类和其他服务类,如下所示:

@RequestScoped
public class FileHandler {

   // make sure to use the interface 
   @EJB
   FileService fileService;
}
也许您已经有了类似的东西,但是它应该在MANIFEST.MF中没有任何条目的情况下工作

另见:


我有一个类似的问题,通过自定义模块位置解决了,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" id="Application_ID" version="6">
  <display-name>BibliotecaEAR2</display-name>
  <module>
    <web>
      <web-uri>BibliotecaWeb.war</web-uri>
      <context-root>biblioteca</context-root>
    </web>
  </module>
  <module>
    <ejb>BibliotecaEJB.jar</ejb>
    <bundleDir>/lib</bundleDir> <!-- ADD THIS OPTION TO THE MODULE -->
  </module>
</application>
这个解决方案取自,它使用Maven 3语法,但我认为您也可以使用它,或者您可以迁移到Maven 3


希望这能有所帮助。

我有一个类似的问题,我的项目结构与您的建议类似。如何告诉Maven将接口或jar与bean一起包含在lib/文件夹中?
@RequestScoped
public class FileHandler {

   // make sure to use the interface 
   @EJB
   FileService fileService;
}
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" id="Application_ID" version="6">
  <display-name>BibliotecaEAR2</display-name>
  <module>
    <web>
      <web-uri>BibliotecaWeb.war</web-uri>
      <context-root>biblioteca</context-root>
    </web>
  </module>
  <module>
    <ejb>BibliotecaEJB.jar</ejb>
    <bundleDir>/lib</bundleDir> <!-- ADD THIS OPTION TO THE MODULE -->
  </module>
</application>