簡體   English   中英

第三方庫在Tomcat中的最佳實踐

[英]Third party libraries best practice in Tomcat

我正在使用Tomcat來托管我的Java Web和Web服務應用程序很長一段時間。 主要用於SpringGrails應用程序。

最近,在一個項目中,討論了如何處理Tomcat生產環境中的依賴項/庫:

在我的項目中,我正在部署大型WAR文件 ,其中包含WEB-INF / lib文件夾中應用程序的所有必需依賴項。 我在tomcat / lib文件夾中放置的唯一內容是由tomcat管理的JDBC連接的JAR文件。

客戶與WebSphere有着悠久的歷史,並認為容器應該包含大部分所需的依賴項。 因此,他們希望將已使用的框架或WebService API(如Metro)的JAR文件放在tomcat / lib文件夾中,並具有瘦的WAR文件

在我看來,該解決方案的問題在於,如果您的應用程序需要已包含在tomcat / lib文件夾中的其他版本的依賴項,則可能會出現錯誤和奇怪的行為。

是否有一些最佳實踐或官方文件談論這個問題? 你對此有何看法?

將依賴包裝的jar包裝到war文件中可能會產生更大的war文件,但它提供了很多好處。 大戰爭文件成為一個單獨的,獨立的,完整的部署單元。 您可以獲取該war文件並將其部署到開發人員桌面,客戶接受環境和生產環境,並確信war文件中您自己的代碼引用了所有依賴項的預期版本。

根據我的經驗,將jar放入Tomcat的lib文件夾而不是war文件的唯一時間是當您的代碼通過接口引用某個庫時,在部署時間之前您將不知道底層實現。 例如,我有一個與JMS集成的項目,我知道我必須支持消息傳遞基礎架構的多個部署。 某些環境需要使用ActiveMQ。 使用Websphere MQ所需的其他環境。 在這種情況下,我將JMS接口jar打包到war文件中,然后在部署時,我將ActiveMQ或Websphere MQ實現jar放入tomcat / lib。

當然,這意味着war文件不再是一個完整的部署單元。 相反,部署過程分為兩步。 這是一種權衡。 我認為這比管理多個war文件構建變體更容易,每個變量捆綁一個不同的JMS提供者jar。

是否有一些最佳實踐或官方文件談論這個問題?

我懷疑你會發現官方文件(來自Tomcat開發者/社區)來支持這個理論,盡管它非常有效。 我必須在之前的工作中准備一個,以便可以跨多個J2EE容器部署應用程序的EAR文件。

但有一點是有利的。 您可以打開標題為“WebSphere Application Server V6.1:類加載器問題確定”的IBM紅皮書(鑒於WAS 7可用,已經過時了),它演示了如何在WebSphere中創建共享庫。 在WebSphere上,可以為需要不同版本的應用程序創建多個此類庫。 在Tomcat上,由於所有共享庫都被轉儲到$ CATALINA_HOME \\ lib中 ,因此您可能不知道類加載器是什么的管理員的憐憫。

紅皮書也有這方面的建議(用實用程序JAR替換實用程序文件,你有答案):

你不應該放置實用程序文件的地方

在決定放置實用程序文件的最佳位置時,必須認識到這些文件不應包含在WebSphere Application Server的環境中。

例如:app_server_root / lib,app_server_root / lib,/ ext *,app_server_root / java(包括所有子目錄)或JVM類路徑。

將實用程序文件添加到這些目錄可能會導致WebSphere運行時環境出現問題,並可能導致意外結果,包括覆蓋可能對服務器的整體功能有害的WebSphere類。

我會選擇可選包: http//docs.oracle.com/javase/6/docs/technotes/guides/extensions/index.html

腳步:

  1. 將你的代碼,庫打包在jar / war中。

  2. 在上面的MANIFEST.MF中聲明了擴展名列表jar

  3. 在目標應用程序中引用它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM