2009-06-26 77 views
1

在我們的商店中,我們正在維護大約20個Java EE Web應用程序。這些應用程序中的大多數在其架構中都非常類似CRUD,其中一些應用程序非常適合處理器密集型應用程序。Java EE Jar文件共享

爲了部署這些應用程序,我們一直在使用Hudson來監控我們的CVS存儲庫。當我們進行檢查時,這些項目將被設置爲編譯並部署到我們的Tomcat 6.0服務器(Solaris 10,sparc雙核1.6 GHz處理器,2 GB RAM ......不是任何一端想像力...),如果項目存在任何單元測試,則執行這些測試,並且僅在單元測試通過時才部署項目。這很好。 (Hibernate,POI(Excel輸出),SQL Server JDBC驅動程序,JSF,ICEFaces等)創建的許多項目都會重複使用相同的.jar文件。現在,隨着時間的推移,業務邏輯.jar文件等)。我們的做法是在我們的網絡驅動器上保存一個文件夾,其中儲存了我們一直使用的所有默認.jar文件,當新項目啓動時,我們將這組.jar文件複製到新項目中並從那裏開始。 ..我覺得如此每次發生這種情況,它已經開始讓我在晚上。我的同事告訴我,在tomcat服務器上建立一個.jar存儲庫是「非常困難的」,我不會再買一秒鐘......我把它歸結爲純粹的懶惰,沒有學習最佳實踐的慾望。我可能是錯的,但是,我只是陳述我對這件事的感受。這似乎也擴大了我們部署到服務器的.war文件的大小。

從我的理解來看,Tomcat本身有一組可供所有應用程序部署的.jar文件,所以我認爲我們可以將所有這些重複的.jar文件合併到所有項目中並移動他們到tomcat服務器上。這隻涉及更新服務器上的一個.jar文件,例如,我們需要將ICEFaces .jar文件更新爲新版本。

我的另一部分內容是,通過在服務器上只包含一個.jar文件副本,我可能需要在我的開發環境中保留一份服務器lib目錄的副本(即將那些.jar文件包含在日食依賴)。

我的直覺告訴我,我想將這些重複的.jar文件移動到服務器上......這樣做會工作嗎?

回答

2

我認爲Maven和Ivy出生的目的是幫助管理JAR依賴關係。也許你會發現那些幫助很大。至於有關在每個項目中複製JAR而不是將它們放入服務器/ lib的爭論,我認爲這取決於一點:您是否有可能要升級部署在Tomcat上的每個應用程序與此同時?你能設想一個時間,你可能有N個應用程序在該服務器上運行,而第(N + 1)個應用程序可能需要或需要更新版本的特定JAR?

如果你不介意讓所有的應用程序保持同步,通過任何方式讓他們使用一個共同的庫基地。

我個人認爲磁盤空間很便宜。我的首選是複製每個應用程序的JAR並將它們放入WAR文件。我喜歡分區。當OSGi變得更加主流時,我希望看到更多。

1

它在大多數情況下都能正常工作,但是您可能會遇到煩人的情況,即您已經移動到tomcat中的jar正在試圖在您的一個Web應用程序jar中創建一個類的實例,從而導致拋出ClassNotFoundException異常。我曾經這樣做,但因爲這些問題而停止。

1

我真的不認爲把圖書館放在一起/ lib是一個好主意。使用war文件作爲應用程序到servlet容器中的想法是讓你的web應用程序有一個真正的隔離概念。您可能會面臨像部署第三方WAR(在WEB-INF/lib中擁有自己的庫)的錯誤,並且它會意外地表現出它的行爲,因爲它會從普通的庫中加載其中一個庫的其他版本(請記住,加載類的常規行爲是首先看一下普通的類加載器,如果你沒有發現這個類看起來像你的webapp)。甚至沒有提到將某些應用程序移動到其他servlet容器或應用程序服務器是多麼痛苦。 如前所述,您可以使用maven來處理jar依賴關係,如果您喜歡同類庫的使用,請在所有應用程序中定義一個POM父項(maven術語)。

1

根據我的經驗,您應該非常小心地在Web應用程序之間共享庫,方法是將它們移動到Web容器本身中。

讓他們生活在WEB-INF/lib中,這樣你的戰爭是自成一體的(你會很高興你有一天會這樣做)。

您可能會考慮使用maven或Ant常春藤來從公共存儲庫中提取庫罐。這是非常有用的,在你的情況下不應該是一個問題。


編輯:一個值得注意的例外是地鐵庫 - 從Glassfish的Web服務層 - 這需要在Web容器,而不是在Web應用程序。