Glassfish v3:Web应用程序未在同一EAR中查找JAR

时间:2014-10-20 17:08:24

标签: deployment glassfish-3

我在Eclipse中创建了一个EAR应用程序,以便在Glassfish 3.1中运行。使用的项目包括:BibliotecaEAR2(主要的EAR。' Biblioteca' 表示'图书馆' ),{{ 1}}(使用EJB),BibliotecaEJB(使用实体和DAO)和BibliotecaModel(Web应用程序)。 BibliotecaWeb具有以下结构:

application.xml

在BibliotecaWeb中,<?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> 写成:

META-INF/MANIFEST.MF

当我启动glassfish时,我收到此警告消息:

Manifest-Version: 1.0
Class-Path: lib/google/guava-18.0.jar 
 // other JARs in BibliotecaEAR2 project
 BibliotecaEJB.jar

虽然它并没有阻止我运行应用程序,但我想消除它。

使用Google搜索PWC6351警告,我发现当在清单文件中找不到用过的JAR时会发生这种情况。但是,请求JAR不仅仅是一个外部库,而是同一个EAR中的子项目。我应该做任何其他配置吗?

谢谢,

Rafael Afonso

2 个答案:

答案 0 :(得分:0)

来自Packaging libraries with EARs

  

在EAR文件中打包应用程序时,库JAR需要   放在存档lib目录中(存档根目录下的jar文件)   不会添加到类路径中,因此可以从其他EAR中获取   伪影。)

     

将库放在&#34; / lib&#34; EAR的目录(   目录名称可以在application.xml中重写)将是可见的   没有进一步的所有子模块(JAR,WAR和RAR)   组态。无需在EAR清单中添加Class-Path条目。

事实上,您不需要引用lib文件夹中的jar,如果您在EAR根级别引用jar,看起来它将无效,就像您的{{1} }。

如果您没有从WAR模块类到EJB模块类的真正依赖关系,您可以删除BibliotecaEJB.jar中的所有条目,它应该可以正常工作。

如果你反而拥有从WAR到EJB的真正依赖关系,你可能需要考虑你的项目结构以及你是否真的需要一个EAR。您还可以将所有内容打包到一个WAR中。

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

<强> 1。步骤

您必须为所有&#34;服务&#34;创建接口。应该可用于Web应用程序(WAR)中的类的类。

这是一个简单的例子:

MANIFEST.MF

public interface FileService {

   public void showFileInformation(File file);
}

<强> 2。步骤

下一步是将所有新接口打包到一个新jar中。您的模型罐看起来与此方法类似。如果不能将其用于此目的,请创建一个简单的Java应用程序项目,该项目将打包为jar并将所有接口放入此项目中。此jar必须位于EAR的@Stateless @Local(FileService.class) @Remote(FileService.class) public class FileServiceImpl implements FileService { @Override public void showFileInformation(File file) { // here // is // the // real // stuff } } 文件夹中。

lib

然后,您必须在WAR和EJB模块中为此新jar添加依赖项,以便它们可以找到接口类。

第3。步骤

可以将服务注入Web应用程序的托管类(以及其他服务类),如下所示:

BibliotecaEAR2
     -- BibliotecaEJB
     -- BibliotecaWeb
     -- /lib/interfaces.jar

也许你已经有类似的东西,但它应该在@RequestScoped public class FileHandler { // make sure to use the interface @EJB FileService fileService; } 没有任何条目的情况下工作。

另见:

答案 1 :(得分:0)

我遇到了类似的问题,并通过自定义模块位置解决了这个问题,比如

<?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 EAR plugin documentation,它使用Maven 3语法,但我认为您也可以使用它(或者您可以迁移到Maven 3)。

希望有所帮助。