2015-04-30 65 views
0

我是新來的Java。在部署Web應用程序時遇到一些問題。WAR網頁應用重新部署依賴關係

我有一個EJB項目,我在Glassfish(4.1)上部署。 我還有第二個部署到同一服務器的JSF WEB應用程序。 雖然我正在考慮將它部署到一個單獨的服務器,因此它會創建它自己的InitialContext等來訪問EJB。

Web應用程序依賴於EJB項目。依賴關係在web應用程序的pom中聲明。 部署Web應用程序時,由於某種原因,它還嘗試從其他項目部署EJB。 由於EJB已經在此服務器上單獨部署,因此失敗,出現錯誤,如javax.naming.NameAlreadyBoundException

如何解決這個問題,這樣就不會嘗試部署來自WEB應用程序的EJB依賴關係?

更新:該解決方案需要重構,因此EJB不會被依賴。

  Original   

    Project A     WEB app 
________________   ____________ 
| + EJBs   |<------| WEB stuff | 
| + Domain cl. |  ------------ 
| + Remote intf. | 
---------------- 

=========================================== 
      Refactored 

    _______  ____________ 
| EJBs |----->| Domain cl. | 
    -------  ------------ 
    |    ^
    |     | 
    |     | 
    v     | WEB app 
    ______________  ____________ 
| Remote intf. | <---| Web stuff | 
    --------------  ------------ 

回答

2

你可以給依賴provided一個scope

<dependency> 
    <groupId>group.id</groupId> 
    <artifactId>artifact.some.id</artifactId> 
    <version>1.0</version> 
    <type>ear</type> 
    <scope>provided</scope> 
</dependency> 

這意味着,在運行時,相關性將被由容器提供。

看到Maven的文檔:

這很像編譯,而是指你所期望的JDK或容器,以提供在運行時的依賴。例如,在爲Java Enterprise Edition構建Web應用程序時,您可以將Servlet API和相關Java EE API的依賴性設置爲範圍,因爲Web容器提供了這些類。此範圍僅在編譯和測試類路徑中可用,且不是傳遞性的。

+0

這實際上讓我部署到同一臺服務器。謝謝。 現在,當我嘗試部署到另一臺服務器時,我從WEB應用程序中得到'java.lang.NoClassDefFoundError'。 我可以將EJB依賴項聲明回到'compile'範圍,但是這些EJB也會被部署,並且在其他服務器上不需要它們。 有沒有辦法阻止EJB依賴性部署,但包括類? EJB總是遠程檢索。 – Varis

+0

聽起來對我來說,您需要爲部署到同一服務器時設置不同的Maven配置文件,而在部署到單獨的服務器時需要另一個配置文件。然後,您將相關配置文件 – KernelKoder

+0

的相關性設置爲所需的範圍,我認爲我發現了該問題。 EJB項目在一個項目中具有EJB,域類和遠程接口。我把它分解了。 Web應用程序僅依賴於遠程接口和域類。用ascii uml更新了問題。 – Varis