2008-12-02 172 views
7

假設您有幾個應用程序共享相同的代碼和大多數其他資源,但外觀和感覺有些不同,某些標籤更改等等(認爲是品牌)。如果每個Web應用程序要使用其自己的WAR文件,那麼您將共享資源放在哪裏?不同的WAR文件,共享資源

我已經使用類路徑來共享類和屬性文件。但是JavaScript和css文件呢?創建和部署一個額外的WAR文件的最佳方式是將這些共享文件提供給任何其他應用程序所需的文件嗎?我也想到了一個構建腳本,它可以做一些魔法,並且從一個普通的源代碼中發出(稍微)不同的WAR,但是我不喜歡它,因爲當你需要構建/測試/運行一個應用程序。

任何其他提示和技巧,將不勝感激。

回答

5

您可以將兩個WAR部署在相同的EAR中,並將公共資源放入EAR中。然後將適當的依賴關係放在Web應用程序的清單中,以鏈接到耳朵中的jar文件。

3

如果你不想走EAR路線,使用tomcat等;還有其他一些方法可以實現您想要的一致性。

如果您只想分享js和css,請查看pack:tag。您可以從apache服務器託管.js和css,設置您的httpd.conf,以便您的webapps可以調用它,然後在應用程序的戰爭中使用pack:tag - DRY和一步壓縮。

0

感謝迄今爲止的回覆,但我恐怕忘了提及WAR將部署在完全隔離的不同環境中。

所以也許在實際的應用程序旁邊部署一個通用的WAR是唯一的選擇。我想我會用下面去:

  • WAR1,含WAR2應用,具體的東西
  • CommonWAR方含共同的東西(不是開玩笑)
  • EAR1:WAR1 + CommonWAR,在ENV1
  • 部署
  • EAR2:WAR2 + CommonWAR,在ENV2部署
+0

在這種情況下,CommonWar不起任何作用。只需將你的公共資源放在它的lib目錄中的每個WAR中,或者放入EAR本身。一場戰爭並不意味着打包資源,EAR就是爲此目的服務的。如果你簡單地把它放在每個WAR中,雖然需要更少的配置。 – Robin 2008-12-03 17:30:37

+0

是的,但是如果我將公共資源放在每個WAR文件中,那麼我會複製這些資源:不會那樣做。如果我將公共資源放在EAR文件中,那麼它必須包含所有依賴這些資源的WAR文件:無法做到這一點,必須在每個環境中部署一個WAR。 – eljenso 2008-12-04 15:55:16

0

更新

是的,我再次。我實際上改變了主意(再次:))。目前我正在試圖(變得更謹慎這裏):

  • (公用)WAR:包含應用程序,常見的(大部分)+一些具體的東西
  • EAR1:CommonWAR +特定的配置文件ENV1
  • EAR2:env2的CommonWAR +特定配置文件

配置文件由WAR拾取。它位於EAR類路徑中,只包含一個具有值的屬性「應用程序」。然後,單個WAR將在適當的地方使用這些信息來區分兩個應用程序(配置,樣式表,...)。

使用我的解決方案EAR1 = CommonWAR + WAR1,EAR2 = CommonWAR + WAR2,在CommonWAR中查找靜態資源非常困難或無法使用web url(例如使用iText生成的PDF文檔中的圖像)。

5

我在使用maven進行構建時,使用了WAR overlays,這種類似產品線配置的策略我見過。您可以定義一個包含常見內容的通用WAR,並將其與包含特定內容的其他WAR進行疊加,以便爲每個應用程序生成不同的WAR。如果您在不同的機器上部署WAR-variants,此方法可能最有用。但我不確定我是否真的可以推薦這個。

如果您真的重寫了內容,請記住指定重疊配置,否則重寫順序不確定。它甚至可能會隨着Maven-War-plugin升級而改變。 (它在我們的情況下。)

0

如何將你的CSS和JS放入類路徑中並用servlet提供它們?然後,您可以將公共資源構建爲jar,並且該jar甚至可以包含servlet(如果您喜歡,則爲資源調度程序),並且war文件可以在WEB-INF/lib文件夾中包含jar文件。