2014-10-20 62 views
0

我在Eclipse中創建了一個EAR應用程序,以在Glassfish 3.1中運行。所使用的項目有:BibliotecaEAR2(主要EAR '藏書'意味着'庫'),BibliotecaEJB(使用EJB),BibliotecaModel(與實體和DAO)和BibliotecaWeb(Web應用程序)。該application.xml具有這樣的結構:Glassfish v3:Web應用程序未在同一EAR中找到JAR

<?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> 

在BibliotecaWeb中,META-INF/MANIFEST.MF是這樣寫:

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

當我啓動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) 

雖然它不要阻止我運行應用程序,我想消除它。

使用Google搜索PWC6351警告,我發現它在清單文件中找不到使用的JAR時發生。然而,請求JAR不只是一個外部庫,而是一個在同一個EAR中的子項目。我應該做什麼額外的配置?

感謝,

拉斐爾·阿豐索

回答

0

Packaging libraries with EARs

當EAR文件打包應用程序,該庫的JAR需要 放在檔案lib目錄(在罐歸檔根級別 未添加到類路徑中,因此可從其他EAR 文物中獲得。)

放置在EAR的「/ lib」目錄( 目錄名稱可在application.xml中覆蓋)的庫罐將對所有子模塊(JAR,WAR和RAR)可見 ,不需要其他 組態。無需在EAR清單中添加Class-Path條目。

其實你並不需要引用的罐子在lib文件夾,它看起來就像如果你引用一個罐子放在耳朵根級別,像你BibliotecaEJB.jar將無法​​正常工作。

如果您沒有從WAR模塊類到EJB模塊類的真正依賴關係,那麼您可以從MANIFEST.MF中刪除所有條目,它應該可以工作。

如果您確實擁有從WAR到EJB的真正依賴關係,那麼您可能需要考慮項目結構以及是否真的需要EAR。您也可以將所有內容打包到一個WAR中。

使用戰爭和EJB模塊的EAR正確的方法需要工作的一點點如果您當前的WAR類直接依賴於類從EJB模塊:

第1步

你必須爲所有「服務」類創建接口,這些類應該可用於Web應用程序(WAR)中的類。

下面是一個簡單的例子:

public interface FileService { 

    public void showFileInformation(File file); 
} 

@Stateless 
@Local(FileService.class) 
@Remote(FileService.class) 
public class FileServiceImpl implements FileService { 

    @Override 
    public void showFileInformation(File file) { 
    // here 
    // is 
    // the 
    // real 
    // stuff 
    } 
} 

2步

下一步是打包所有的新的接口到一個新的罐子。你的模型jar看起來很像這種方法。如果這不能用於此目的,請創建一個簡單的Java應用程序項目,該項目將打包爲jar並將所有接口放入此項目中。該罐必須位於EAR的lib文件夾中。

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

然後,你必須依賴到這個新的JAR在你的WAR和EJB模塊,使他們能找到的接口類。

3步驟

服務可以這樣被注入的Web應用程序的管理類(和爲其他服務類):

@RequestScoped 
public class FileHandler { 

    // make sure to use the interface 
    @EJB 
    FileService fileService; 
} 

也許你已經有類似的東西這,但它應該沒有在MANIFEST.MF任何條目工作。

參見:

+1

我有一個類似的問題,我的項目結構類似於你的建議。你如何告訴Maven在'lib /'文件夾中包含接口(或者包含beans的jar)? – 2016-06-23 16:22:43

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 3語法的Maven EAR plugin documentation,但我認爲您也可以使用它(或者您可以遷移到Maven 3)。

希望有所幫助。

相關問題