Liferay 部署war包時候的deployDirectory 細節分析

引入:

在上文中,我們從宏觀上講解了Liferay部署war包的動作是如何觸發監聽器并且完成部署過程的,但是其中最核心的一塊deployDirectory我們沒講,它的作用是當有了臨時目錄并且已經把war包的內容展開到該目錄之后,是如何對其中內容進行解析,再加工并且最終復制到最終的部署目錄deployDir的,我們這里就研究這塊內容:


調試分析:

首先,我們看下這個復雜方法的入參:

132716489.png


srcFile參數是我們臨時目錄,也就是被展開的war文件對應的目錄。

132944846.png

mergeDir是一個目錄,用于merge的,我們設置為在LIFERAY部署目錄($LIFERAY_HOME/deploy)中建一個merge目錄,然后以我們的war包名字為子目錄,如下:

133154903.png

deployDir不用說了, 也就是在tomcat的webapps目錄下我們的應用最終要放置到的目錄:

133310746.png

后面3個參數不用說了。


我們開始分析:

首先在第514行調用rewriteFiles去重寫臨時目錄中srcDir中的幾個文件:

133944579.png

代碼我不貼了,一看就懂,它的目的是對于web.xml, liferay-plugin-package.xml,liferay-display.xml,liferay-portlet.xml,portlet.xml這5個文件進行子元素的縮進,并且縮進量都是一個制表符的距離。所以最終文件都會變成:

<parent-ele>

? ? ? ?<child-ele>

這種縮進格式


接著在第516行中調用mergeDirectory(mergeDir,srcFile)方法,.因為我們的mergeDir為空,所以直接這段代碼跳過。


接著在第518行調用processPluginPackageProperties(srcFile,displayName,pluginPackage)對于plugin package的properties文件進行處理,因為我們沒有liferay-plugin-package.properties,取而代之我們是用xml文件的,所以這段代碼也跳過。


接著會在第520行調用copyJars(srcDir,pluginPackage) 方法,

135729896.png

他們會吧$CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目錄下的多個jar文件

分別復制到我們srcFile指定的portlet臨時目錄下的WEB-INF/lib目錄下。

細心的你一定會問,為什么突然多出來$CATALINA_HOME/liferay/com/liefray/portal/deploy/dependencies目錄,為什么會有這么多jar文件?其實我也不知道,我們在最后“精華疑點解答中”會分析,這里姑且假定這個目錄已經存在并且由這些jar文件吧。


然后在第521行調用copyProperties(srcFile,pluginPackage)方法。

140717531.png

細節我省去了,它會去吧logging.properties,log4j.properties,service.properties等這些文件從$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目錄

141210984.png

復制到我們用srcFile變量指定的portlet臨時目錄下的WEB-INF/class目錄下。


接下來它會在第522行調用copyTlds(srcFile,pluginPackage)方法:

141650980.png

他們會吧aui.tld,liferay-portlet.tld,liferay-portlet-ext.tld,liferay-security.tld,liferay-theme.tld,liferay-ui.tld,liferay-util.tld這些Taglib定義文件都復制到我們用srcFile變量指定的portlet臨時目錄下的WEB-INF/tld目錄下,那么這些原始文件在哪里呢?也許你猜對了,他們還是在$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies 目錄下:

142122748.png


接下來它會去調用copyXmls(srcFile,displayName,pluginPackage)方法。

142343706.png

首先它會調用super.copyXmls,這個的作用是用來判斷服務器類型來確定如何去復制服務器特定的xml文件和web.xml文件到我們用srcFile變量指定的portlet臨時目錄下的WEB-INF目錄下:

142516561.png

因為我們的appServerType是"tomcat",所以它不會復制服務器特定的xml文件,只會復制一個web.xml。

然后因為我們appServerType是'tomcat",所以它會復制context.xml文件到我們用srcFile變量指定的portlet臨時目錄下的/META-INF目錄下。

最后會吧_servlet_context_include.jsp文件復制到我們用srcFile變量指定的portlet臨時目錄下的/WEB-INF/jsp目錄下.

那么這些xml文件是不是還是在$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies 目錄下呢?回答正確~

143235472.png


接下來它在第524行調用copyPortalDependencies(srcFile) ,因為我們沒有定義plugin package的properties文件,所以這行沒執行。


接下來它在第530行調用updateWebXml(webXml,srcFile,displayName,pluginPackage)方法對于我們從$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目錄下直接復制來的最原始的xml進行更新,對其中內容進行了增刪,(關于這一塊也十分復雜, 我準備另外用一文章來介紹)


接下來對于/WEB-INF/ext-lib/global和/WEB-INF/ext-lib/portal中的jar包處理,把他們復制到liferay 服務器上的對應目錄,因為我們沒有,所以跳過。


接下來在第558行,調用updateDeployDirectory(srcFile)對部署目錄進行更新。


然后對于jar包進行排除操作了:

144844676.png

首先,它先判斷服務器類型,因為我們是tomcat ,所以它會去吧tomcatLibDir中的所有的jar包都放在排除列表中,這個tomcatLibDir是

145021238.png

然后它會去讀取剛才conext.xml,如果其中指定了com.liferay.support.tomcat.loader.PortalClassLoader,那么就去掉3個jar包。


然后把**/WEB-INF/web.xml也加在exclude列表中,因為這web.xml總要被改動的,所以我們這個文件不會最終復制到tomcat下的webapps下我們應用的deployDir中。最終我們的exclude列表如下:

150639723.png


然后第674行執行復制動作,它吧我們的$CATALINA_HOME/temp/<時間戳下>的我們的臨時的應用信息去除exclude列表中的web.xml和一些jar文件其他全部復制到$CATALINA_HOME/webapps/<項目名>這個最終部署目錄下:

150542896.png


最后第678行單獨復制web.xml文件,并且overrite設置為true, 表示覆蓋原有的。我們從服務器的所有文件時間戳可以看到這一點,如下:

151334545.png

從上面我們可以看到WEB-INF目錄下,只有最后一行的web.xml的時間戳比較上次發生了改變,這就表明這個web.xml是單獨復制的,實踐果然和代碼執行相互吻合。


最后第690行吧這個新生成的web.xml的lastModified設置為當前的時間+6秒。

151643146.png


最最后吧我們吧tempDir(也就是我們在$CATALINA_HOME/temp/<時間戳>)這個目錄刪除,

151834315.png

就一切大功告成了,從deployDirectory()方法返回。



精華疑點解答:

在總結之前,還有一個疑惑沒明白,就是我們看部署的很多動作都是要先從$CATALINA_HOME/liferay/com/liefray/portal/deploy/dependencies目錄中吧各種文件(包括properties文件,tld文件,xml文件等)復制到tempDir中,那么這個文件是何時生成的又是為什么包含這么多內容呢?我們現在來專門研究這個問題。

很快就找到了答案,它這些內容從classpath復制到$CATALINA_HOME/temp/liferay 目錄下的

154135646.png

而classpath這些文件,經過仔細查找,發現都來自于$CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar ,比如說所有用到的tld文件:

154438674.png



總結:

(1)deployDirectory的整體作用是在tomcat的temp目錄擁有一個從war包展開的目錄結構然后經過一些配置,重組,最后復制到webapps下響應應用的部署目錄的過程。

(2)首先它會調用rewriteFiles去重寫目錄下的幾個xml文件,目的是讓文件更規范,有縮進的格式。

(3)然后它會讀取plugin-package.properties中的屬性設定到Properties中。

(4)然后調用copyJars()方法吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目錄下的多個jar文件分別復制到我們srcFile指定的portlet臨時目錄下的WEB-INF/lib目錄下。

(5)然后調用copyProperties吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies

目錄下的多個properties文件分別復制到我們srcFile指定的portlet臨時目錄下的WEB-INF/classes目錄下.

(6)然后調用copyTlds吧CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies

目錄下的多個tld文件分別復制到我們srcFile指定的portlet臨時目錄下的WEB-INF/tld目錄下.

(7)然后調用copyXmls方法,先根據服務器類型來決定吧服務器特定的xml文件和web.xml文件復制到我們srcFile指定的portlet臨時目錄下的WEB-INF目錄下,如果是tomcat服務器還要復制context.xml文件到portlet臨時目錄下的META-INF目錄下,然后把_servlet_context_include.jsp復制到portlet臨時目錄下的WEB-INF/jsp目錄下。以上文件都是從CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies目錄中獲取的。

(8)然后調用updateWebXml(webXml,srcFile,displayName,pluginPackage)方法對于我們從$CATALINA_HOME/temp/liferay/com/liferay/portal/deploy/dependencies目錄下直接復制來的最原始的xml進行更新,對其中內容進行了增刪(這個放在以后文章中單獨討論)

(9)接下來對于/WEB-INF/ext-lib/global和/WEB-INF/ext-lib/portal中的jar包處理,把他們復制到liferay 服務器上的對應目錄

(10)從第(4)-(8)中的每一步復制,這些資源文件都是來自于CATALINA_HOME/liferay/com/liferay/portal/deploy/dependencies 目錄,而這些資源文件最初都是來自$CATALINA_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar中,這些資源在Liferay運行后會被加載到classpathResource中。

(11)在最終復制到webapps下的部署目錄之前,它必須要先生成一個排除列表,表明在復制時候那些資源要先排除,web.xml總是被排除的, 另外還有一些jar文件,取決于我們的配置。

(12)復制到webapps下部署目錄的動作總是分為2部分,一是復制除排除列表中的所有文件目錄,二是單獨復制web.xml文件,所以每次可以看到web.xml的時間戳總比其他文件晚。

(13)最后復制完會到webapps下我們應用的部署目錄下把最新的web.xml的lastModified屬性往后面調6秒。





本文轉自 charles_wang888 51CTO博客,原文鏈接:http://blog.51cto.com/supercharles888/1286631,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392603.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode 164. 最大間距(桶排序)

給定一個無序的數組&#xff0c;找出數組在排序之后&#xff0c;相鄰元素之間最大的差值。 如果數組元素個數小于 2&#xff0c;則返回 0。 示例 1: 輸入: [3,6,9,1] 輸出: 3 解釋: 排序后的數組是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。 示例 2: …

批處理定時mysql備份數據庫_定時備份mysql數據庫的批處理

定時備份mysql數據庫的批處理代碼&#xff0c;保存為backup_mysql.bat&#xff0c;運行即可。復制代碼 代碼如下:echo offset txt1%date:~0,4%::當前年set txt2%date:~5,2%::當前月set txt3%date:~8,2%::當前日set txt4%time:~0,2%::當前小時set txt5%time:~3,2%::當前分鐘set …

算法訓練營 重編碼_您在編碼訓練營期間可能面臨的最大挑戰

算法訓練營 重編碼by Joanna Gaudyn喬安娜高登(Joanna Gaudyn) 您在編碼訓練營期間可能面臨的最大挑戰 (The biggest struggles you might face during a coding bootcamp) You think that during a coding bootcamp nothing can be more challenging than learning programmi…

1449 砝碼稱重(思維)

題目鏈接&#xff1a;https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId259281 題解&#xff1a;這題有一個技巧&#xff0c;畢竟是w^0,w^1,w^2....這樣&#xff0c;必然會想到w進制&#xff0c;而且就只能用一次。 那么就簡單了&#xff0c;把m拆成w進制&#xf…

leetcode 454. 四數相加 II(哈希表)

給定四個包含整數的數組列表 A , B , C , D ,計算有多少個元組 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 為了使問題簡單化&#xff0c;所有的 A, B, C, D 具有相同的長度 N&#xff0c;且 0 ≤ N ≤ 500 。所有整數的范圍在 -228 到 228 - 1 之間&#xf…

“換標”Intel的窮則思變

成語有云“窮則思變”&#xff0c;用這個詞來形容早先的Intel換標也最恰當不過。當然這里“窮”&#xff0c;不是說Intel很貧窮&#xff0c;而是說Intel在自己的產業到了盡頭。Intel推產品概念的水平是一流的&#xff0c;雖然某些概念事后被認為是錯誤的&#xff08;如&#xf…

mysql開發中遇到的坑_mysql優化過程中遇見的坑(mysql優化問題特別注意)

單條查詢最后添加 LIMIT 1&#xff0c;停止全表掃描。對于char(4) 或者vachar(4)&#xff0c;無論是中文還是英文都是存儲四個字符&#xff0c;注意是字符而不是字節。如果一個字段未int類型&#xff0c;此類型只有0、1兩個狀態&#xff0c;需要為此建立索引嗎&#xff1f;過度…

初級開發人員的缺點_在您作為初級開發人員的第一年獲得此建議

初級開發人員的缺點Are you a junior developer embarking on your software development career?您是從事軟件開發事業的初級開發人員嗎&#xff1f; Or a recent computer science graduate who has recently started a new job?還是最近剛開始從事新工作的計算機科學專業…

Spark日志分析

根據tomcat日志計算url訪問了情況&#xff0c;具體的url如下&#xff0c; 要求&#xff1a;區別統計GET和POST URL訪問量 結果為&#xff1a;訪問方式、URL、訪問量 輸入文件&#xff1a; 196.168.2.1 - - [03/Jul/2014:23:36:38 0800] "GET /course/detail/3.htm HTTP/1.…

進程、線程和協程的區別

首先&#xff0c;給出“進程、線程和協程”的特點&#xff1a; 進程&#xff1a;擁有自己獨立的堆和棧&#xff0c;既不共享堆&#xff0c;也不共享棧&#xff0c;進程由操作系統調度&#xff1b;線程&#xff1a;擁有自己獨立的棧和共享的堆&#xff0c;共享堆&#xff0c;不共…

leetcode 493. 翻轉對(分治算法)

給定一個數組 nums &#xff0c;如果 i < j 且 nums[i] > 2*nums[j] 我們就將 (i, j) 稱作一個重要翻轉對。 你需要返回給定數組中的重要翻轉對的數量。 示例 1: 輸入: [1,3,2,3,1] 輸出: 2 代碼 class Solution {public int reversePairs(int[] nums) {return getR…

使用brew安裝軟件

brew 又叫Homebrew&#xff0c;是Mac OSX上的軟件包管理工具&#xff0c;能在Mac中方便的安裝軟件或者卸載軟件&#xff0c; 只需要一個命令&#xff0c; 非常方便 brew類似ubuntu系統下的apt-get的功能 閱讀目錄 安裝brew 使用brew安裝軟件 使用brew卸載軟件 使用brew查詢軟…

mysql 繞過select報錯_MySQL注射繞過技巧(三)

在測試一次注入的時候發現過濾了逗號 所以找到這個思路第一次遇到的時候是看key哥挖洞 遇到后就想記錄下來正文過濾了逗號 利用join來逐步查詢select*from(select 1)a join (select 2)b join (select 3)c;例如下圖逐步查詢user()user() basediruser() basedir version()也可以…

深入理解javascript

深入理解JavaScript系列&#xff08;1&#xff09;&#xff1a;編寫高質量JavaScript代碼的基本要點 深入理解JavaScript系列&#xff08;2&#xff09;&#xff1a;揭秘命名函數表達式 深入理解JavaScript系列&#xff08;3&#xff09;&#xff1a;全面解析Module模式 深入理…

spark 并行處理_如何使用Spark集群并行處理大數據

spark 并行處理by Hari Santanam通過Hari Santanam 如何使用Spark集群并行處理大數據 (How to use Spark clusters for parallel processing Big Data) 將Apache Spark的彈性分布式數據集(RDD)與Databricks一起使用 (Use Apache Spark’s Resilient Distributed Dataset (RDD)…

django前后端分離部署

部署靜態文件&#xff1a; 靜態文件有兩種方式1&#xff1a;通過django路由訪問2&#xff1a;通過nginx直接訪問 方式1&#xff1a; 需要在根目錄的URL文件中增加&#xff0c;作為入口 url(r^$, TemplateView.as_view(template_name"index.html")), 在setting中更改靜…

Citrix、Microsoft、VMware虛擬桌面之網頁接口登錄對比

軟件環境 Citrix Xendesktop 5.6 Microsoft Windows Server 2008 R2 Hyper-v VMware View client 4.6 首先看citrix的&#xff0c;很早之前Citrix就推出了網頁的虛擬桌面和應用程序&#xff0c;默認是單點登錄獲取桌面 下面是微軟的&#xff0c;和citrix很類似&#xff0c; 據我…

leetcode 976. 三角形的最大周長

給定由一些正數&#xff08;代表長度&#xff09;組成的數組 A&#xff0c;返回由其中三個長度組成的、面積不為零的三角形的最大周長。 如果不能形成任何面積不為零的三角形&#xff0c;返回 0。 示例 1&#xff1a; 輸入&#xff1a;[2,1,2] 輸出&#xff1a;5 示例 2&…

recyclerview 加載fragment_恢復 RecyclerView 的滾動位置

您可能在開發過程中遇到過這種情況&#xff0c;在 Activity/Fragment 被重新創建后&#xff0c;RecyclerView 丟失了它之前保有的滾動位置信息。通常這種情況發生的原因是由于異步加載 Adapter 數據&#xff0c;且數據在 RecyclerView 需要進行布局的時候尚未加載完成&#xff…

4.6.2 軟件測試的步驟

系統測試是可有可無的。因為系統測試是和環境結合在一起。系統測試應該是在系統設計或者是需求分析階段的前一步來完成的。 單元測試它的測試計劃是在詳細設計階段完成。所以說單元測試的計劃是在詳細設計階段來完成的。 模塊接口的測試它保證了測試模塊的數據流可以正確地流入…